data.table を結合し、再コピーせずに既存の data.frame に列を追加する 質問する

data.table を結合し、再コピーせずに既存の data.frame に列を追加する 質問する

data.tablesX (300 万行 x 約 500 列) と Y (100 行 x 2 列) の2 つがあります。

set.seed(1)
X <- data.table( a=letters, b=letters, c=letters, g=sample(c(1:5,7),length(letters),replace=TRUE), key="g" )
Y <- data.table( z=runif(6), g=1:6, key="g" )

X に対して左外部結合を実行したいのですが、次Y[X]の方法で実行できます。

data.tables の X[Y] 結合で完全外部結合、つまり左結合が許可されないのはなぜですか?

しかし、新しい列を追加したいX それなしコピーしますX(大きいので)。

明らかに、 のようなものはX <- Y[X]動作しますが、 がdata.table私が思っているよりもはるかに巧妙でない限り (そして私は がかなりずる賢いと評価しています!)、これは 全体をコピーすると思いますX

X[ , z:= Y[X,z]$z ]動作しますが、不格好で、複数の列にうまく拡張できません。

マージの結果を、保持された data.table に効率的に (コピーとプログラマーの時間の両方の観点から) 保存するにはどうすればよいですか?

ベストアンサー1

これは簡単に実行できます:

X[Y, z := i.z]

Y[X]これが機能するのは、ここでの との唯一の違いはX[Y]、一部の要素が に含まれていない場合でありY、その場合にはzにしたいと考えるでしょうNA。これは、上記の割り当てによって正確に実現されます。

これは、多くの変数に対しても同様に機能します。

X[Y, `:=`(z1 = i.z1, z2 = i.z2, ...)]

操作が必要なのでY[X]、引数を追加してnomatch=0(@mnel が指摘しているように)、X に Y のキー値が含まれていない場合に NA を取得しないようにすることができます。つまり、次のようになります。

X[Y, z := i.z, nomatch=0]

からdata.table のニュース

    **********************************************
    **                                          **
    **   CHANGES IN DATA.TABLE VERSION 1.7.10   **
    **                                          **
    **********************************************

新機能

o   The prefix i. can now be used in j to refer to join inherited
    columns of i that are otherwise masked by columns in x with
    the same name.

おすすめ記事