R - 按组聚合,具有一些功能

时间:2016-10-30 01:33:52

标签: r aggregate

我想通过某个组和操作来聚合数据框

数据

> df <- data.frame(replicate(9, 1:4))
  X1 X2 X3 X4 X5 X6 X7 X8 X9
1  1  1  1  1  1  1  1  1  1
2  2  2  2  2  2  2  2  2  2
3  3  3  3  3  3  3  3  3  3
4  4  4  4  4  4  4  4  4  4

聚合

> aggregate(df[,2], list(df[,1]), mean)
  Group.1 x
1       1 1
2       2 2
3       3 3
4       4 4

以上聚合工作,这很好。但是,我需要使用mean之类的函数组合代替mean*sd/length^2而不是foo* tmp; 。我们应该在这里使用聚合以外的东西吗?

3 个答案:

答案 0 :(得分:1)

我修改了您的示例数据框,以便获得每个组的长度和标准差(您不能每组只有一个数据点)。

> df
   X1 X2 X3 X4 X5 X6 X7 X8 X9
1   1  1  1  1  1  1  1  1  1
2   2  2  2  2  2  2  2  2  2
3   3  3  3  3  3  3  3  3  3
4   4  4  4  4  4  4  4  4  4
5   1  1  1  1  1  1  1  1  1
6   2  2  2  2  2  2  2  2  2
7   3  3  3  3  3  3  3  3  3
8   4  4  4  4  4  4  4  4  4
9   1  4  4  4  4  4  4  4  4
10  2  5  5  5  5  5  5  5  5
11  3  6  6  6  6  6  6  6  6
12  4  7  7  7  7  7  7  7  7
13  1  4  4  4  4  4  4  4  4
14  2  5  5  5  5  5  5  5  5
15  3  6  6  6  6  6  6  6  6
16  4  7  7  7  7  7  7  7  7

通过更详细的公式聚合:

aggregate(df[,2], list(df[,1]), function(x){mean(x)*sd(x)/length(x)^2})
  Group.1         x
1       1 0.2706329
2       2 0.3788861
3       3 0.4871393
4       4 0.5953925

如果您想要使用相同的列标签:

aggregate(list(X2 = df[,2]), list(X1 = df[,1]), function(x){mean(x)*sd(x)/length(x)^2})
  X1        X2
1  1 0.2706329
2  2 0.3788861
3  3 0.4871393
4  4 0.5953925

(或之后用colnames重命名)

答案 1 :(得分:1)

以下是使用dplyr

的方法
df %>% group_by(X1) %>% summarize(x = mean(X2)*sd(X2)/length(X2)^2)

答案 2 :(得分:0)

以下是data.table

的选项
library(data.table)
setDT(df)[, .(x = mean(X2)*sd(X2)/.N^2), by = X1]