2017-01-02 70 views
0

我有兩個data.tables:分配與data.table聯接操作,多重匹配

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

合併dt1[dt2, on='a']

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

我們需要使用

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

如果我們沒有興趣在改變初始數據集「DT1」,然後

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

在OP的方法的問題是,經過了加入時,作業(:=)發生在第一個數據集('dt1')中,並且它只有2行,因此,分配的值也將在這2行而不是3行中。一種選擇是將其分配給第二個數據集(如第一種方法所示),或者通過連接新列「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