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")。因此我发现使用 tapply
或 aggregate(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)
这里是 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")。因此我发现使用 tapply
或 aggregate(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)