2016-09-26 50 views
2

與data.table陣列我有一個名爲data.tabledt看起來如下:乘法中的R

ID V1 V2 V3 V4 V5 time color 
1 F T F F T 1 red 
1 F T T F T 2 red 
2 T F T F F 1 blue 
3 F F F F F 2 green 
3 T T T F T 3 purple 

在現實中,dim(dt) = [1321221 123]。現在我知道,在一般情況下,真假存儲爲1和0,分別R.我也有一個數組l,雖然看起來像

V1 V2 V3 V4 V5 
1 2 1 3 4 

這些都是分配給V1,V2,V3,V4,V5權重。我想將這些權重乘以真實值(因爲它們的數值爲1)並在每行中添加,就像我們可以對矩陣進行的操作一樣。輸出應該看起來像

ID Total time color 
1 6  1 red 
1 7  2 red 
2 2  1 blue 
3 0  2 green 
3 8  3 purple 

現在還記得,這其實是實際數據的一小集,所以我要尋找一個快速的解決方案,最好有data.table的解決方案,所以我可以提高自己的技能data.table

回答

6
dt[, .(ID, Reduce(`+`, Map(`*`, .SD, l)), time, color), .SDcols = V1:V5] 
# ID V2 time color 
#1: 1 6 1 red 
#2: 1 7 2 red 
#3: 2 2 1 blue 
#4: 3 0 2 green 
#5: 3 8 3 purple 

# or using matrix product 

dt[, .(ID, as.matrix(.SD) %*% t(l), time, color), .SDcols = V1:V5] 
+0

這可能需要版本1.9.7+。我不記得'.SDcols'錯誤以外的列何時修復,但我認爲這是相當近的。 – eddi

1

@Eddi有一個更清潔的答案,但如果你需要在1.9.6版本的東西:

dt[, Total := apply((t(l * t(dt[, 2:6, with = FALSE]))),1,sum)] 
dt[, 2:6 := NULL] 
setcolorder(dt, c("ID", "Total", "time", "color"))