【问题标题】:Aggregating across columns of data table跨数据表的列聚合
【发布时间】:2016-09-20 13:23:47
【问题描述】:

我的 data.table 看起来像

ID1 ID2 ID3 X1 X2 X3 X4 X5 ....
E01 ASD DSA 9  2  1  22 4
E03 SDF FDX 21 9  0  10 2
E04 MAX XXX 77 2  .5 23 1.5 ..

对于每个 ID1(保持 ID2 和 ID3 不变),我想计算 Xx 的不同子组的平均值,输出应如下所示

ID1 ID2 ID3 av_X1_X3 av_X4_X5   ...
E01 ASD DSA 4        13         ...
E03 SDF FDX 10       6

Xx 的范围从 X0 到 X90,我需要能够轻松输入三到五个可能的 Xx 分组。

【问题讨论】:

  • 为什么av_X1_X3 4 在第一行?不是 5 个?
  • 9+2+1=12 12/3=4 ?

标签: r data.table


【解决方案1】:

您没有提到如何定义子组。如果您打算为每个子组手动完成,这应该不会太难输入

s <- "ID1 ID2 ID3 X1 X2 X3 X4 X5
E01 ASD DSA 9  2  1  22 4
E03 SDF FDX 21 9  0  10 2
E04 MAX XXX 77 2  .5 23 1.5"

dt <- fread(s)
dt[, av_X1_X3 := mean(c(X1, X3)), by = ID1]

在一行中添加更多列:

dt[, `:=`(av_X1_X3 = mean(c(X1,X3)), av_X4_X5 = mean(c(X4,X5))),by=ID1]

【讨论】:

  • 谢谢!这将是手动的,我可以在 j 中插入此类定义的列表吗?例如:dt[,.(av_X1_X3 :=mean(c(X1,X3)), av_X4_X5 :=mean(c(X4,X5))),by=ID1)
  • 当然可以,但是语法会有点不同。请参阅答案中的编辑。
  • @ThreeDiag 抱歉,我不太确定您打算进行的编辑av_X1_X3 = mean(c(X1,X2,X3)) 如果您想要 av_X1_X2_X3,那没关系,但变量名确实应该与其含义相符。而且在概念上,在这个答案中使用 X1_X2 或 X1_X2_X3 没有太大区别,因为你问的是一般方法而不是具体结果。
  • 这就是我想做的,正如示例所暗示的那样,我正在寻找一种方法来获得从 X1 到 X3 的列的平均值。反正都是小事。另外,sintax dt[, av_X1_X3 := mean(X1:X3), by=ID1] 也可以满足我的要求(对于更长的 cols 序列)。
  • 好的,知道了。我建议为此使用像av_X1_to_X3 这样的变量名。
猜你喜欢
  • 2017-06-07
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
  • 2018-07-11
相关资源
最近更新 更多