2015-09-27 26 views
4

我有两个data.tables,一个有另一个行/列的子集。我想小data.table的值添加到一个较大的值:在两个data.tables中添加值

DT1 <- as.data.table(matrix(c(0, 1, 2, 3), nrow=2, ncol=2, 
     dimnames=list(c("a", "b"), c("a", "b"))), keep=T) 
DT2 <- as.data.table(matrix(c(0, 0, 1, 2, 2, 1, 1, 0, 3), nrow=3, ncol=3, 
     dimnames=list(c("a", "b", "c"), c("a", "b", "c"))), keep=T) 

DT1 
# rn a b 
#1: a 0 2 
#2: b 1 3 
DT2 
# rn a b c 
#1: a 0 2 1 
#2: b 0 2 0 
#3: c 1 1 3 

我想DT1添加到DT2让我得到

# rn a b c 
#1: a 0 4 1 
#2: b 1 5 0 
#3: c 1 1 3 

我知道我可以用DT1 DT2覆盖的值很容易:

DT2[DT1, names(DT1) := DT1, on="rn"] 

我希望这样的事情会的工作:

DT2[DT1, names(DT1) := DT1 + .SD, on="rn"] 

...但它没有。虽然这可能会有一些简单的变化,但是,对吗?

回答

5

我喜欢理查德的方式,价值观,但在这里,看起来更像是OP的初步设想一种替代方案:

vs = setdiff(names(DT1),"rn") 
DT2[DT1, (vs) := { 
    x.SD = mget(vs) 
    i.SD = mget(paste0("i.",vs)) 
    Map("+", x.SD, i.SD) 
}, on="rn", by=.EACHI] 
# rn a b c 
# 1: a 0 4 1 
# 2: b 1 5 0 
# 3: c 1 1 3 
+1

虽然这可能更复杂一些,但它比Richard的答案快得多 - 谢谢! – Stan

7

您可以使用rbindlist()把两者结合起来,再总结基于rn

rbindlist(list(DT1, DT2), fill=TRUE)[, lapply(.SD, sum, na.rm = TRUE), by = rn] 
# rn a b c 
# 1: a 0 4 1 
# 2: b 1 5 0 
# 3: c 1 1 3