data.tables
X (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]
********************************************** ** ** ** 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.