为什么不先在data.table中聚合行

时间:2017-07-27 02:53:00

标签: r data.table aggregate

我很困惑为什么我无法通过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)上使用一些简单的均值函数?

1 个答案:

答案 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)]