我試圖根據另一個表中的值更新data.table。我認爲我有一個辦法(雖然不是特別有效,因爲我的實際dt2有3.5M記錄),但事實證明我的代碼有問題根據另一個data.table中的值更新data.table
在DT1我有一些我想要的變量(數字)取決於它們的分類值是什麼來設置爲1或0。數據
例子:
dt1 <- data.table(urn = 1:10, V1=0,V2=0,V3=0)
## urn V1 V2 V3
## 1: 1 0 0 0
## 2: 2 0 0 0
## 3: 3 0 0 0
## 4: 4 0 0 0
## 5: 5 0 0 0
## 6: 6 0 0 0
## 7: 7 0 0 0
## 8: 8 0 0 0
## 9: 9 0 0 0
##10: 10 0 0 0
dt2 <- data.table(urn=rep(1:10,2),classification=0)
dt2$classification <- 1:7 #does give a warning message
## urn classification
## 1: 1 1
## 2: 2 2
## 3: 3 3
## 4: 4 4
## 5: 5 5
## 6: 6 6
## 7: 7 7
## 8: 8 1
## 9: 9 2
##10: 10 3
##11: 1 4
##12: 2 5
##13: 3 6
##14: 4 7
##15: 5 1
##16: 6 2
##17: 7 3
##18: 8 4
##19: 9 5
##20: 10 6
我希望發生的就是骨灰盒相匹配,和甕有1分的紀錄,然後設置V1標誌爲1;其中urn分類爲2,設置V2 = 1;你明白了。
我目前的做法是:
setkey(dt1, urn)
setkey(dt2, urn)
dt1[dt2, V1:= ifelse(i.classification == 1 , 1, dt1$V1)]
dt1[dt2, V2:= ifelse(i.classification == 2, 1, dt1$V2)]
dt1[dt2, V3:= ifelse(i.classification == 6, 1, dt1$V3)]
dt1
## urn V1 V2 V3
## 1: 1 1 0 0
## 2: 2 1 0 0
## 3: 3 1 0 1
## 4: 4 1 0 0
## 5: 5 1 0 0
## 6: 6 1 1 0
## 7: 7 1 0 0
## 8: 8 1 0 0
## 9: 9 1 0 0
##10: 10 1 0 1
我其實希望輸出的樣子是:
## urn V1 V2 V3
## 1: 1 1 0 0
## 2: 2 0 1 0
## 3: 3 0 0 1
## 4: 4 0 0 0
## 5: 5 1 0 0
## 6: 6 0 1 1
## 7: 7 0 0 0
## 8: 8 1 0 0
## 9: 9 0 1 0
##10: 10 0 0 1
任何幫助將不勝感激。特別是如果我能夠簡化命令以在一次掃描中管理所有這些命令而不是3次連接的數據。正如我所說的3.5M記錄增加了一些開銷(特別是當我實際上將設置約10列的標誌)。
在此先感謝。
像'dcast(DT1 [DT2],甕〜分類)'可能工作 – shadow 2014-09-29 10:35:29