我想根據連接和固定值更新data.table中行的子集。data.table使用常量更新連接
d1 <- data.table(A = 5:1, B = letters[5:1])
d2 <- data.table(C = letters[5:1], Z = 6:10)
current.val <- 5
我想要做的是更新d1基於與d2的連接,但只有在d1中的A = 5的地方。是這樣的:
d1[d2, D := i.Z ,on=.(B==C, A==current.val)]
我目前的做法是增加一個新的列到D2,並將其設置爲固定值,並使用在連接:
d2[, current.val := 5]
d1[d2, D := i.Z ,on=.(B==C, A==current.val)]
這工作,但看起來像一個很多開銷。有一種更簡單的方法來在連接中使用常量值嗎?
(8/14)爲基準的新尺度範例:
d1 <- data.table(A = 100:1, B = 100000000:1, D = as.numeric(NA), key = c("A", "B"))
d2 <- data.table(C = 100000000:1, Z = c(10:1)/10, key = "C")
current.val <- 5
system.time(d1[cbind(d2, A = current.val), on = .(B = C, A), D := i.Z])
system.time({setkey(d1, B, A); d1[d1[d2][A == current.val], D := Z]; setkey(d1, A, B)})
system.time(d1[d1[d2][A == current.val], D := Z]) # fastest, if inverse key order is acceptable
您的解決方案看起來很簡單。如果你不想創建一個列,那麼使用行索引,即'i1 < - d1 [,.I [A == current.val]]; d1 [i1,D:= d1 [i1] [d2,i.Z [i1],on =。(B == C)]]' – akrun
不確定您是否在那裏做基準測試。我得到了「錯誤vecseq [...]加入結果超過2^31行」爲第二個。 – Frank
Frank,請參閱下面@gcbenison的回答評論。病毒更新的帖子,以反映工作基準 – Ethan