我想通过某个组和操作来聚合数据框
数据
> 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;
。我们应该在这里使用聚合以外的东西吗?
答案 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]