Aggregate() - R - 是否可以对所有子集和超集进行计算?

Aggregate() - R - is it possible to do calculation for all subsets and superset?

这里是 Whosebug 新手...我已经阅读了很多 aggregate()、by() 和 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 多个变量要计算(示例中不仅有一个变量 "breaks")。因此我发现使用 tapplyaggregate(breaks ~ tension, data = warpbreaks, mean) 然后合并结果是低效的。请告诉我在这种情况下是否有更好的数据操作方法!

我相信有一种更优雅的方法,但是简单的 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 

这是一个相当丑陋的答案

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))})

谢谢大家。从中学到了很多。欺骗答案: 通过 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)