2017-03-06 64 views
0

我有2個數據幀df1和df2。R:與數據框中的其他列匹配列並保存它們轉換

df1 <- data.frame(ID = c("aa", "ab", "ac", "ad", "ae", "af"), y = 1:6) 
df2 <- data.frame(x = c("aa","ac", "aa", "ac", "ab","aa","fa"), obj=c("F70", "F60", "F71", "F82", "F92", "F62")) 

我想的「ID」,並與DF2「×」欄DF1匹配,則在DF2保存OBJ列DF1與那場比賽調換。這樣,我得到:

ID y 
aa 1 F70 F71 F62 
ab 2 F92 NA NA 
ac 3 F60 F82 NA 
ad 4 NA NA NA 
ae 5 NA NA NA 
af 6 NA NA NA 

回答

1

您可以通過格式化df2data.table做到這一點,然後用df1合併:

library(data.table) 
df1 <- data.frame(ID = c("aa", "ab", "ac", "ad", "ae", "af"), y = 1:6) 
df2 <- data.frame(x = c("aa","ac", "aa", "ac", "ab","aa"), obj=c("F70", "F60", "F71", "F82", "F92", "F62")) 

# split and collapse df2 
df2.collapse <- sapply(split(df2$obj, f = df2$x), function(x) paste(x, collapse = ',')) 

# make a new df2 
df2.new <- data.frame(ID = names(df2.collapse), tstrsplit(df2.collapse, ',')) 

# merge with df1, you may want to change the colnames of new columns 
merge(df1, df2.new, by = 'ID', all.x = T) 
# ID y c..F70....F92....F60.. c..F71...NA...F82.. c..F62...NA..NA. 
# 1 aa 1     F70     F71    F62 
# 2 ab 2     F92    <NA>    <NA> 
# 3 ac 3     F60     F82    <NA> 
# 4 ad 4     <NA>    <NA>    <NA> 
# 5 ae 5     <NA>    <NA>    <NA> 
# 6 af 6     <NA>    <NA>    <NA>