2014-03-25 57 views
17

我試圖使用dplyr包的功能應用到一個data.frame所有列未進行分組,其中我會做aggregate()如何使用dplyr將函數應用於所有非group_by列?

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

其中mean被應用到所有列不用於分組。 (是的,我知道我可以使用集合,但我想了解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](http://stackoverflow.com/questions/21295936/can-dplyr-summarise-over-several-variables-without-listing-each-one)**。 – BrodieG

回答

33

如果你願意嘗試實驗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中。

+0

適合我。即使所有缺失數據的組都返回NaN。 – kmm

+0

我無法複製虹膜數據集上的錯誤。但我有數據表明,當我全部做到這一點時($ date == a $ CALENDAR_YEAR_MONTH)。但是做group_by(a,date)%。%summarise_each(funs(median = median(。,na.rm = T),mean))給出'[.data.table'(dt,,list(median = median (CALENDAR_YEAR_MONTH,: 組4的結果的第1列是'整數'類型,但期望類型'double'。列類型必須對每個組保持一致。 – xiaodai

4

這將使您幾乎在dplyr的所有路上。

h = iris %.% 
    group_by(Species) %.% 
    do(function(d){ 
    sapply(Filter(is.numeric, d), mean) 
    }) 

as.data.frame(h) 
+0

我不會推薦以這種方式使用'do()',因爲它可能會在0.2中改變 – hadley

+2

在'dplyr'中是否有一種慣用的方法?在'data.table'中,我可以做'data.table(iris)[,lapply(.SD,mean),Species]'。 – Ramnath

相關問題