在两个data.tables中添加值

Sta*_*tan 7 r data.table

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

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
Run Code Online (Sandbox Code Playgroud)

我想将DT1添加到DT2,以便我得到

#   rn a b c
#1:  a 0 4 1
#2:  b 1 5 0
#3:  c 1 1 3
Run Code Online (Sandbox Code Playgroud)

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

DT2[DT1, names(DT1) := DT1, on="rn"]
Run Code Online (Sandbox Code Playgroud)

我希望这样的东西能起作用:

DT2[DT1, names(DT1) := DT1 + .SD, on="rn"]
Run Code Online (Sandbox Code Playgroud)

......但事实并非如此.可能有一些简单的变化可行,但是,对吗?

Ric*_*ven 8

您可以使用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
Run Code Online (Sandbox Code Playgroud)


Fra*_*ank 7

我更喜欢理查德的方式,但这里有一个看起来更像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
Run Code Online (Sandbox Code Playgroud)

  • 尽管这可能有些令人费解,但它比Richard的回答要快得多-谢谢! (2认同)