2015-09-27 57 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 
相關問題