2013-01-03 129 views
3

假設我有一些常見的可變x兩個數據幀:合併和R中粘貼重複列

df1 <- data.frame( 
    x=c(1, 2, 3, 4), 
    y=c("a", "b", "c", "d") 
) 

df2 <- data.frame( 
    x=c(1, 1, 2, 2, 3, 4, 5), 
    z=c("A", "B", "C", "D", "E", "F", "G") 
) 

我們可以假設變量的每個條目我們合併了,x,恰好出現在一次df1;但是,在df2中可能會出現任意次數。

我想合併df2'到'df1,同時保留df1。有沒有合併這兩個數據幀的快速方式,使得合併後的輸出將是形式(例如):

df_merged <- data.frame( 
    x=c(1, 2, 3, 4), 
    y=c("a", "b", "c", "d"), 
    z=c("A B", "C D", "E", "F") 
) 

從本質上講,我想df_merged是原始df1的組成,除了df2中的任何變量強制匹配df1的格式。 merge的各種咒語會將新行添加到我想要避免的合併輸出中。

我們可以假設我們正在合併的變量的每個條目x只出現一次。

速度也是一個優先事項,因爲我將合併相當大的數據幀。

回答

0

我用自己的潛在答案提交這個問題,但它相當慢,我很好奇其他方法可用。

by <- "x" 
df2_processed <- as.data.frame( 
    sapply(names(df2), function(x) { 
     tapply(df2[[x]], df2[[by]], function(xx) { 
     if(x == by) { 
      return(xx[1]) 
     } else { 
      paste(xx, collapse=" ") 
     } 
     }) 
    }), optional=TRUE, stringsAsFactors=FALSE) 

merge(df1, df2_processed, all.x=TRUE) 
1
merge(df1, 
     aggregate(df2$z , df2[1], FUN=paste, collapse=" ", sep=""), 
     by.x="x", by.y=1) 
    x y x 
1 1 a A B 
2 2 b C D 
3 3 c E 
4 4 d F 
Warning message: 
In merge.data.frame(df1, aggregate(df2$z, df2[1], FUN = paste, collapse = " ", : 
    column name ‘x’ is duplicated in the result 
> M1 <- .Last.value 
> names(M1)[3] <- "z" 
> M1 
    x y z 
1 1 a A B 
2 2 b C D 
3 3 c E 
4 4 d F 
1

另一種選擇:

df2.z <- with(df2, tapply(z, x, paste, collapse=' ')) 
transform(df1, z=df2.z[match(x, names(df2.z))]) 

# x y z 
# 1 1 a A B 
# 2 2 b C D 
# 3 3 c E 
# 4 4 d F 

如果df1$x妥當,那麼在變換語句中使用df2.z[names(df2.z) %in% x]