R 基于另一个data.table值递增data.table值

R 基于另一个data.table值递增data.table值,r,data.table,R,Data.table,我有两个data.tables,其中一个表包含另一个表的行/列的子集。对于较小表中的每个非零值,我希望将较大data.table的值增加1: 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)

我有两个data.tables,其中一个表包含另一个表的行/列的子集。对于较小表中的每个非零值,我希望将较大data.table的值增加1:

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的问题:……我需要同时做这两个:)

< P>我会考虑一些类似的…

inc_em <- with(melt(DT1)[value != 0], split(rn, variable))

for (k in names(inc_em))
    DT2[.(rn = inc_em[[k]]), (k) := get(k) + 1, on="rn" ]

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

<>代码>我想……
inc_em <- with(melt(DT1)[value != 0], split(rn, variable))

for (k in names(inc_em))
    DT2[.(rn = inc_em[[k]]), (k) := get(k) + 1, on="rn" ]

#    rn a b c
# 1:  a 0 3 1
# 2:  b 1 3 0
# 3:  c 1 1 3
inc_em另一种方式:

require(data.table) # v1.9.6+
xcols = c("a", "b")
icols = paste0("i.", xcols) # "i.*" to refer to DT1's cols
DT2[DT1, (xcols) := Map(function(x, y) x + (y > 0L), mget(xcols), mget(icols)), on="rn"]

这应该是什么样子的:

DT2[DT1, (xcols) := Map(function(x, y) x + (y > 0L), .SD, i.SD), .SDcols=xcols, i.SDcols = icols]
或者更好的办法是:

DT2[DT1, (xcols) := .SD + (i.SD > 0L), .SDcols=xcols, i.SDcols=icols]
另一种方式:

require(data.table) # v1.9.6+
xcols = c("a", "b")
icols = paste0("i.", xcols) # "i.*" to refer to DT1's cols
DT2[DT1, (xcols) := Map(function(x, y) x + (y > 0L), mget(xcols), mget(icols)), on="rn"]

这应该是什么样子的:

DT2[DT1, (xcols) := Map(function(x, y) x + (y > 0L), .SD, i.SD), .SDcols=xcols, i.SDcols = icols]
或者更好的办法是:

DT2[DT1, (xcols) := .SD + (i.SD > 0L), .SDcols=xcols, i.SDcols=icols]

我对第二部分有点困惑。。第一段代码非常有效。“事件更好”部分看起来很干净,我很想这样写,但是当我这样做的时候,我得到了“未使用的参数(I.SDcols=icols)”。这是因为它还没有实现。我对第二部分有点困惑。。第一段代码非常有效。“事件更好”部分看起来很干净,我很想这样写,但当我这样做时,我得到了“未使用的参数(I.SDcols=icols)”,这是因为它还没有实现。