2015-09-27 61 views
1

我有两个data.tables,一个有另一个行/列的子集。我想以1为每一个非零值较小的表增加较大data.table值:基于另一个data.table值递增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 

我想这样我得到

# rn a b c 
#1: a 0 3 1 
#2: b 1 3 0 
#3: c 1 1 3 
递增的DT2值

(这与我刚才的问题上增加DT1和DT2:Adding values in two data.tables ...我需要做两件事:))

回答

4

另一种方式:

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] 
+0

我用的有点困惑第二部分。第一部分代码很好。 “更好的事件”部分看起来很干净,我很乐意这样写,但是当我这样做时,我会得到“未使用的参数(i.SDcols = icols)”。 – Stan

+1

这是因为它尚未实现。 – Arun

2

我会考虑像...

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 
相关问题