dplyr:如何在函数内使用group_by?
我想在另一个函数中使用dplyr::group_by
函数,但是我不知道如何将parameter passing给这个函数。
有人可以提供一个工作的例子?
library(dplyr) data(iris) iris %.% group_by(Species) %.% summarise(n = n()) # ## Source: local data frame [3 x 2] ## Species n ## 1 virginica 50 ## 2 versicolor 50 ## 3 setosa 50 mytable0 <- function(x, ...) x %.% group_by(...) %.% summarise(n = n()) mytable0(iris, "Species") # OK ## Source: local data frame [3 x 2] ## Species n ## 1 virginica 50 ## 2 versicolor 50 ## 3 setosa 50 mytable1 <- function(x, key) x %.% group_by(as.name(key)) %.% summarise(n = n()) mytable1(iris, "Species") # Wrong! # Error: unsupported type for column 'as.name(key)' (SYMSXP) mytable2 <- function(x, key) x %.% group_by(key) %.% summarise(n = n()) mytable2(iris, "Species") # Wrong! # Error: index out of bounds
对于编程, group_by_
是group_by_
的对应部分:
library(dplyr) mytable <- function(x, ...) x %>% group_by_(...) %>% summarise(n = n()) mytable(iris, "Species") # or iris %>% mytable("Species")
这使:
Species n 1 setosa 50 2 versicolor 50 3 virginica 50
更新当时这是写dplyr使用%.%
这是最初使用上面,但现在%>%
是受青睐,所以已经改变,以保持这一相关。
现在不推荐使用更新2重新分组,而是使用group_by_。
根据Roberto的评论, Update 3 group_by_(list(...))
现在在新版本的dplyr中变成了group_by_(...)
。
更新4添加评论中build议的小变化。
更新 :由于dplyr 0.7.0,你可以使用整洁eval来完成这一点。
有关更多详细信息,请参阅http://dplyr.tidyverse.org/articles/programming.html 。
library(tidyverse) data("iris") my_table <- function(df, group_var) { group_var <- enquo(group_var) # Create quosure df %>% group_by(!!group_var) %>% # Use !! to unquote the quosure summarise(n = n()) } my_table(iris, Species) > my_table(iris, Species) # A tibble: 3 x 2 Species n <fctr> <int> 1 setosa 50 2 versicolor 50 3 virginica 50
他们来的时候丑陋,但她的作品:
mytable3 <- function(x, key) { my.call <- bquote(summarise(group_by(.(substitute(x)), NULL), n = n())) my.call[[2]][[3]] <- as.name(key) eval(my.call, parent.frame()) } mytable3(iris, "Species") # Source: local data frame [3 x 2] # # Species n # 1 virginica 50 # 2 versicolor 50 # 3 setosa 50
几乎可以肯定的情况下,会导致这种情况下,但你明白了。 我不认为你可以绕过这个电话。 还有一件事情,但更丑陋的是:
mytable4 <- function(x, key) summarise(group_by(x, x[[key]]), n = n())