2011-10-12 64 views
11

Tôi có một khung dữ liệu với 3 biến và 250K bản ghi. Như một ví dụ xem xétCách hoán đổi giá trị giữa 2 cột

> df <- data.frame(V1=c(1,2,4), V2=c("a","a","b"), V3=c(2,3,1)) 
V1 V2 V3 
1 a 2 
2 a 3 
4 b 1 

và muốn trao đổi giá trị giữa V1 và V3 dựa trên giá trị của V2 như sau: nếu V2 == 'b' sau đó V1 <- V3V3 <- V1 dẫn đến

V1 V2 V3 
1 a 2 
2 a 3 
1 b 4 

Tôi đã thử một việc phải làm nhưng phải mất mãi mãi. Nếu tôi sử dụng Perl, phải mất vài giây. Tôi tin rằng nhiệm vụ này có thể được thực hiện hiệu quả trong R là tốt. Mọi đề xuất đều được đánh giá cao.

+0

Tôi tò mò về tình huống này đã xảy ra như thế nào, nếu bạn không ngại yêu cầu của tôi. Tôi có một số kinh nghiệm sử dụng phần mềm ít nhất là được thiết kế để làm việc với dữ liệu khảo sát, nhưng theo xu hướng tích hợp với cơ sở dữ liệu CNTT, các câu hỏi về cấu trúc dữ liệu đã bắt đầu và tôi cần bắt đầu suy nghĩ một cách có ý thức chúng tôi lưu trữ nội dung trong bảng. Đó là lý do tại sao tôi tò mò về tình hình của bạn như thế nào :) – Jonathan

Trả lời

4

Đã sửa đổi Tôi đã gặp phải các tên cột, xin lỗi. Những công việc này.

Nếu bạn không nhớ các hàng kết thúc trong đơn đặt hàng khác nhau, đây là loại một cách 'dễ thương' để làm điều này:

dat <- read.table(textConnection("V1 V2 V3 
1 a 2 
2 a 3 
4 b 1"),sep = "",header = TRUE) 

tmp <- dat[dat$V2 == 'b',3:1] 
colnames(tmp) <- colnames(dat) 
rbind(dat[dat$V2 != 'b',],tmp) 

Về cơ bản, đó là chỉ cần lấy các hàng nơi V2 == 'b', đảo ngược cột và tát nó lại cùng với mọi thứ khác. Điều này có thể được mở rộng nếu bạn có nhiều cột không cần chuyển đổi; bạn chỉ cần sử dụng một chỉ số nguyên với những giá trị được chuyển đổi, thay vì chỉ là 3:1.

+0

Đây là một cách tuyệt vời để làm điều đó! +1 – Chris

14

Hãy thử điều này

> df <- data.frame(V1=c(1,2,4), V2=c("a","a","b"), V3=c(2,3,1)) 
> df[df$V2 == "b", c("V1", "V3")] <- df[df$V2 == "b", c("V3", "V1")] 
> df 
    V1 V2 V3 
1 1 a 2 
2 2 a 3 
3 1 b 4 
+0

giải pháp gọn gàng! +1. – TMS

10

Bạn có thể sử dụng transform để làm điều này.

df <- transform(df, V3 = ifelse(V2 == 'b', V1, V3), V1 = ifelse(V2 == 'b', V3, V1)) 
+0

Tôi đang thử x = read.table ("1.txt") x <- biến đổi (x, x [[1]] <- ifelse (x [[1]]> x [[2]], x [[2]], x [[1]]), x [[2]] <- ifelse (x [[1]]> x [[2]], x [[1]], x [[2] ])) nhưng không thành công! – phoenix

Các vấn đề liên quan