2017-01-02 10 views
0

私は2つのdata.tables持っている:dt1[dt2, on='a']をマージ割り当て、複数の一致

dt1 = data.table(a=c('a','b')) 
dt2 = data.table(a=c('a','b','b')) 

は、私が操作を実行するとき

a 
1: a 
2: b 
3: b 

はそうdt1[dt2, on='a', c:= 1]が、私は

a c 
1: a 1 
2: b 1 
3: b 1 
を期待しています

代わりに私は

a c 
1: a 1 
2: b 1 

なぜですか?

答えて

2

我々は、我々は最初のデータセット「DT1」を変更するに興味がない場合は、

dt1[dt2, c(.SD, c= 1), on = 'a'] 
# a c 
#1: a 1 
#2: b 1 
#3: b 1 

OPのアプローチに問題があることが後にある

dt2[dt1, c := 1, on = "a"] 
dt2 
# a c 
#1: a 1 
#2: b 1 
#3: b 1 

を使用する必要があります結合(:=)は最初のデータセット( 'dt1')で発生し、2行しかないので、割り当てられた値も3行ではなく2行になります。 1つ目は、最初のメソッドで示したように2番目のデータセットに割り当てるか、新しいカラム 'c'を連結して新しいデータセットを作成することです。

+0

あなたは「参加した後」と言いますが、参加前に割り当てが発生したように聞こえます - そうですか? – sirallen

+1

@sirallenこれは、元のための結合に基づいています。 'a1 < - data.table(a = 1:3); b1 < - data.table(a = 2:4); a1 [b1、c:= 1、on = 'a'] '。あなたはこのアプローチと 'a1 [b1、c(.SD、c = 1)、on = 'a']の違いを見ることができます。 – akrun

関連する問題