我很困惑为什么我无法通过data.table中的mean()得到每一行的平均值。
> aaa <- data.table(matrix(1:9, nrow = 3))
> aaa[, `:=` (avg = mean(V1 + V2 +V3), onethird = (V1 + V2 +V3)/3)]
> aaa
V1 V2 V3 avg onethird
1: 1 4 7 15 4
2: 2 5 8 15 5
3: 3 6 9 15 6
似乎data.table所做的是 mean(V1)+ mean(V2)+ mean(V3)而不是 mean(V1 + V2 + V3)。
~~~~~~~~~~~~~~~~~~~~~~~~~
实际上我想通过计算其他列的平均值来生成更多列,例如从V1和V2获取avg12,从V3,V4和V5获得avg345。
> aaa <- data.table(matrix(1:10, nrow = 2))
> aaa[, `:=` (avg12 = (V1 + V2)/2, avg345 = (V3 + V4 + V5)/3)]
> aaa
V1 V2 V3 V4 V5 avg12 avg345
1: 1 3 5 7 9 2 7
2: 2 4 6 8 10 3 8
是否可以在(V1 + V2)或(V1,V2)上使用一些简单的均值函数?
答案 0 :(得分:1)
我们可以使用rowMeans
获取每行的mean
。它也可以直接应用于数据集(.SD
- Data.table的子集,当我们没有指定.SDcols
时,它会占用数据集中的所有列)
aaa[, `:=` (avg = rowMeans(.SD), onethird = (V1 + V2 + V3)/3)]
或另一个选项是使用Reduce
逐行获取,然后除以列数(length(.SD)
)
aaa[, `:=` (avg = Reduce(`+`, .SD)/length(.SD), onethird = (V1 + V2 +V3)/3)]