我有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
技能。
答案 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"))