将数组与R中的data.table相乘

时间:2016-09-26 20:15:56

标签: r data.table

我有data.table名为dt的内容如下:

 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]。现在我知道一般来说,真和假分别在R中存储为1和0.我也有一个数组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技能。

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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"))