【问题标题】:Why not aggregating rows first in data.table为什么不在 data.table 中首先聚合行
【发布时间】:2017-07-27 02:53:00
【问题描述】:

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

【问题讨论】:

  • aaa[, V1 + V2 + V3] 给出c(12,15,18) - 其平均值为15
  • 谢谢,@thelatemail。现在我意识到 mean() 只适用于单列。
  • @DavidArenburg - '为什么 mean() 不能跨 data.table 中的行聚合?也许?

标签: r data.table aggregate


【解决方案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)]

【讨论】:

  • aaa
  • @dhhan 你有什么问题?
  • 这可能是一个解决方案。这很简单,但不只是一句话。
  • @dhhan Fyi,如果您的数据集的形状正确,可以在 R 中进行分析(“长格式”),那就更简单了。顺便说一句,您可能应该发布一个新问题,而不是在一个大的扩展程序中进行编辑(除非您先询问 akrun / 其他回答者,看看他们是否对扩展程序感到满意)。
猜你喜欢
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 2015-02-07
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 2017-03-10
相关资源
最近更新 更多