3

いくつかの共通変数を持つ 2 つのデータ フレームがあるとします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マージする変数 の各エントリは、に 1 回だけ出現すると想定できますdf1。ただし、 では任意の回数出現する可能性がありdf2ます。

を保持しながら、df2「に」をマージしたい。マージされた出力が次のような形式になるように、これら 2 つのデータ フレームをマージする高速な方法はありますか (たとえば)。df1df1

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ます. のさまざまな呪文により、マージされた出力に新しい行が追加されますが、これは避けたいと思います。df2df1merge

xマージする変数 の各エントリは、 1 回だけ出現すると想定できます。

かなり大きなデータ フレームをマージするので、速度も優先事項です。

4

3 に答える 3

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 に答える
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 に答える
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 に答える