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

时间:2015-11-05 22:04:49

标签: r aggregate-functions

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多个变量需要计算(不仅仅是一个变量"中断"例如)。因此,我发现使用tapplyaggregate(breaks ~ tension, data = warpbreaks, mean)然后合并结果效率很低。 Plz告诉我在这种情况下是否有更好的数据处理方法!

3 个答案:

答案 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)