stackoverflow新手在这里......我已经阅读了很多的(),()和tapply()指南,但没有找到答案。
使用R帮助页面中的示例(warpbreaks是R中的数据集),
> aggregate(breaks ~ wool + tension, data = warpbreaks, mean)
wool tension breaks
1 A L 44.55556
2 B L 28.22222
3 A M 24.00000
4 B M 28.77778
5 A H 24.55556
6 B H 18.77778
但是,如果我还需要所有超集的结果(如下面的第7行到第10行),我该怎么编码?
wool tension breaks
1 A L 44.55556
2 B L 28.22222
3 A M 24.00000
4 B M 28.77778
5 A H 24.55556
6 B H 18.77778
7 A - #mean of the set that wool=A, but no restriction to tension
8 B -
9 - L #mean of the set that tension=L, but no restriction to wool
10 - - #mean of the whole set in data frame
如果你有不使用聚合函数的方法也没关系。非常感谢!
大家好,感谢您的回答!实际上我有40多个子集,还有200多个变量需要计算(不仅仅是一个变量"中断"例如)。因此,我发现使用tapply
或aggregate(breaks ~ tension, data = warpbreaks, mean)
然后合并结果效率很低。 Plz告诉我在这种情况下是否有更好的数据处理方法!
答案 0 :(得分:0)
我确信有一种更优雅的方式,但是简单的tapply
呢?之后,通过一些数据操作,您可以将结果组合起来并实现您想要的效果。
> tapply(warpbreaks$breaks, warpbreaks$tension, mean)
L M H
36.38889 26.38889 21.66667
> tapply(warpbreaks$breaks, warpbreaks$wool, mean)
A B
31.03704 25.25926
答案 1 :(得分:0)
这是一个相当丑陋的答案
library(dplyr)
variables = c("wool", "tension")
1:length(variables) %>%
lapply(. %>% combn(variables, ., simplify = F)) %>%
unlist(recursive = F) %>%
c(list(character(0))) %>%
data_frame(variables = .) %>%
rowwise %>%
do({group_by_(warpbreaks, .dots = variables) %>%
summarize(breaks = mean(breaks))})
答案 2 :(得分:0)
感谢大家。从中学到了很多东西。 Dupe答案:
dplyr summarize with subtotals
通过expand.grid
给出网格,并使用函数填充它。
就我而言,由于我在实际数据中总结了多个变量(2000多个变量而不是一个" break"),我发现这个丑陋的答案最快。
result1 <- aggregate(breaks ~ wool + tension, data = warpbreaks, mean)
result2 <- aggregate(breaks ~ wool, data = warpbreaks, mean)
result3 <- aggregate(breaks ~ tension, data = warpbreaks, mean)
result4 <- aggregate(breaks ~ 0, data = warpbreaks, mean)
result <- rbind(result1,result2, result3,result4)