27

data.tablesX (3m 行× 500 列) と Y (100 行× 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 に効率的に (コピーの観点からもプログラマーの時間の観点からも) 保存するにはどうすればよいですか?

4

2 に答える 2

32

これは簡単に行うことができます:

X[Y, z := i.z]

Y[X]とここの の唯一の違いX[Y]は、一部の要素が にない場合Yです。zNA

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

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

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

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

data.tableのNEWSより

    **********************************************
    **                                          **
    **   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.
于 2013-10-23T22:12:31.587 に答える
9

上記の回答に加えて、次のこともできます ( v1.9.6+):

require(data.table) # v1.9.6+
X[Y, (colNames) := mget(paste0("i.", colNames))]

ここで、colNamesは必要な列をリストする文字ベクトルですY。これにより、多くの列を追加する場合に、追加する (colNamesのサブセットから定義する) 列を効率的に選択できます。names(Y)

on=また、次のように新しい引数 ( from v1.9.6+)と組み合わせることができます。

# ad-hoc joins using 'on=' instead of setting keys
require(data.table) # v1.9.6+
X[Y, (colNames) := mget(paste0("i.", colNames)), on = "g"]

(colNames) := mget(colNames)ここでの戦略は akrun の功績によるものです: R のデータ フレームの行を更新します

于 2015-11-17T21:01:02.750 に答える