基于另一个 data.table 值递增 data.table 值
Incrementing data.table value based on another data.table value
我有两个 data.tables,一个是另一个 rows/columns 的子集。对于较小 table:
中的每个非零值,我想将较大 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
我想增加 DT2 中的值,以便得到
# rn a b c
#1: a 0 3 1
#2: b 1 3 0
#3: c 1 1 3
(这类似于我之前关于添加 DT1 和 DT2 的问题:...我需要两者都做:))
我会考虑...
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
另一种方式:
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]
我有两个 data.tables,一个是另一个 rows/columns 的子集。对于较小 table:
中的每个非零值,我想将较大 data.table 的值增加 1DT1 <- 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
我想增加 DT2 中的值,以便得到
# rn a b c
#1: a 0 3 1
#2: b 1 3 0
#3: c 1 1 3
(这类似于我之前关于添加 DT1 和 DT2 的问题:
我会考虑...
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
另一种方式:
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]