3

假设我有两个带有一些公共变量的数据框x

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'into' 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恰好出现一次。

速度也是一个优先事项,因为我将合并相当大的数据帧。

4

3 回答 3

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]在转换语句中使用。

于 2013-01-03T21:09:30.780 回答
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
于 2013-01-03T20:54:04.810 回答
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 )
于 2013-01-03T20:45:30.970 回答