如何使用dplyr将函数应用于所有非group_by列?

17

我正在尝试使用dplyr包对所有未被分组的数据框列应用函数,就像我用aggregate()函数做的那样:

我试图使用dplyr软件包对除分组列之外的所有列应用函数,就像我使用aggregate()函数一样:

aggregate(. ~ Species, data = iris, mean)

对于所有未用于分组的列应用mean函数。(是的,我知道可以使用aggregate,但我正在尝试理解dplyr。)

我可以像这样使用summarize

species <- group_by(iris, Species)
summarize(species,
          Sepal.Length = mean(Sepal.Length),
          Sepal.Width = mean(Sepal.Width))

但是是否有一种方法可以将mean()应用于未分组的所有列,类似于aggregate().~符号?我有一个包含30个列的数据框需要聚合,因此编写单独的语句并不理想。


2
请参考之前的 **SO Q/A**。 - BrodieG
2个回答

35

如果你愿意尝试实验性的dplyr,可以尝试新的(仍然实验性的)summarise_each()

devtools::install_github("hadley/dplyr", ref = "colwise")

library(dplyr)
iris %.%
  group_by(Species) %.%
  summarise_each(funs(mean))
## Source: local data frame [3 x 5]
## 
##      Species Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1     setosa        5.006       3.428        1.462       0.246
## 2 versicolor        5.936       2.770        4.260       1.326
## 3  virginica        6.588       2.974        5.552       2.026

iris %.%
  group_by(Species) %.%
  summarise_each(funs(min, max))
## Source: local data frame [3 x 9]
## 
##      Species Sepal.Length_min Sepal.Width_min Petal.Length_min
## 1     setosa              4.3             2.3              1.0
## 2 versicolor              4.9             2.0              3.0
## 3  virginica              4.9             2.2              4.5
## Variables not shown: Petal.Width_min (dbl), Sepal.Length_max (dbl),
##   Sepal.Width_max (dbl), Petal.Length_max (dbl), Petal.Width_max (dbl)

非常感谢您的反馈!

此功能将出现在dplyr 0.2版本中。


对我来说完美运行。甚至对于所有缺失数据的组,也会返回NaN。 - kmm
我无法在鸢尾花数据集上复制此错误。但是,当我执行all(a$date == a$CALENDAR_YEAR_MONTH)时,我的数据会返回true。但是,执行group_by(a, date) %.% summarise_each(funs(median = median(.,na.rm=T), mean))时出现错误:“Error in [.data.table(dt, , list(median = median(CALENDAR_YEAR_MONTH, : Column 1 of result for group 4 is type 'integer' but expecting type 'double'. Column types must be consistent for each group.” - xiaodai
1
请注意,summarize_each()已被弃用,建议使用summarize_all() - slizb

4
这将让你在dplyr中达到几乎所有的效果。
h = iris %.%
  group_by(Species) %.%
  do(function(d){
    sapply(Filter(is.numeric, d), mean)  
  })

as.data.frame(h)

我不建议以那种方式使用do(),因为它很可能会在0.2中更改。 - hadley
2
dplyr 中有一种惯用的方法吗?在 data.table 中,我可以这样做:data.table(iris)[,lapply(.SD, mean),Species] - Ramnath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接