2012-11-08 21 views
10

tôi có hai khung dữ liệu lớn, một (df1) có cấu trúc nàyMatching nhiều cột trên khung dữ liệu khác nhau và nhận được cột khác như kết quả

chr init 
1 12 25289552 
2 3 180418785 
3 3 180434779 

Các khác (df2) có này

V1 V2  V3 
10 1  69094 medium 
11 1  69094 medium 
12 12 25289552 high 
13 1  69095 medium 
14 3 180418785 medium 
15 3 180434779 low 

Điều tôi đang cố gắng làm là thêm cột V3 của df2 vào df1, để nhận thông tin về đột biến

chr init Mut 
1 12 25289552 high 
2 3 180418785 medium 
3 3 180434779 low 

Tôi đang cố gắng tải cả hai vào R và sau đó thực hiện vòng lặp for sử dụng kết hợp nhưng nó không hoạt động. Bạn có biết cách nào đặc biệt để làm điều này không? Tôi cũng mở cửa làm bằng awk hoặc một cái gì đó tương tự

Trả lời

12

Sử dụng merge

df1 <- read.table(text=' chr init 
1 12 25289552 
2 3 180418785 
3 3 180434779', header=TRUE) 


df2 <- read.table(text=' V1 V2  V3 
10 1  69094 medium 
11 1  69094 medium 
12 12 25289552 high 
13 1  69095 medium 
14 3 180418785 medium 
15 3 180434779 low', header=TRUE) 


merge(df1, df2, by.x='init', by.y='V2') # this works! 
     init chr V1  V3 
1 25289552 12 12 high 
2 180418785 3 3 medium 
3 180434779 3 3 low 

Để có được kết quả mong muốn của bạn theo cách bạn thể hiện nó

output <- merge(df1, df2, by.x='init', by.y='V2')[, c(2,1,4)] 
colnames(output)[3] <- 'Mut' 
output 
    chr  init Mut 
1 12 25289552 high 
2 3 180418785 medium 
3 3 180434779 low 
+0

Vâng, đây là những gì tôi muốn, vấn đề là tôi phải đưa vào tài khoản các chromosome cũng vậy, vì vậy có thể một cái gì đó giống như hợp nhất (df1, df2, by.x = c ('chr', 'init'), by.y = c ('V1', V2 ') [, c (2,1, 4)] – user976991

+0

Chính xác, chỉ cần thêm 'chr' và' V1' vào đối số sẽ đưa chúng vào tài khoản: D Cân nhắc upv ote các câu trả lời hữu ích và chấp nhận một trong số chúng nếu bạn thấy nó hữu ích: D –

0

Liệu

df3 <- merge(df1, df2, by.x = "init", by.y = "V2") 
df3 <- df3[-3] 
colnames(df3)[3] <- "Mut" 

cung cấp cho bạn những gì bạn muốn?

2
df1 <- read.table(textConnection(" chr init 
1 12 25289552 
2 3 180418785 
3 3 180434779"), header=T) 

df2 <- read.table(textConnection(" V1 V2  V3 
10 1  69094 medium 
11 1  69094 medium 
12 12 25289552 high 
13 1  69095 medium 
14 3 180418785 medium 
15 3 180434779 low"), header=T) 

# You have to select the values of df2$V3 such as their corresponding V2 
# are equal to the values of df1$init 
df1$Mut <- df2$V3[ df2$V2 %in% df1$init] 

df1 
    chr  init Mut 
1 12 25289552 high 
2 3 180418785 medium 
3 3 180434779 low 
+0

Lưu ý rằng điều này sẽ không hoạt động nếu có bất kỳ giá trị khóa nào trong 'df1' không có trong' df2'. Bạn sẽ nhận được một lỗi như "thay thế có 3 hàng, dữ liệu có 4". Xem http://stackoverflow.com/questions/1299871/how-to-join-merge-data-frames-inner-outer-left-right/38130460#38130460 để thực hiện kết nối bên trái bằng 'match()'. – bgoldst

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