我正在尝试使用新的下划线函数对标准评估provided in dplyr 0.3进行分组和汇总。但是,在尝试使用lapply而不是循环时遇到了一个问题:
小例子
fruits <- c("APPLE", "PEAR", "BANANA")
makes <- c("HONDA", "FERRARI", "TESLA")
df <- data.frame(fruit = sample(fruits, 100, replace = T),
make = sample(makes, 100, replace = T),
value = 1:100)
cols <- c("fruit", "make")
showTopTenFactors <- function(x, ...) x %>%
group_by_(...) %>%
summarise(cnt = n()) %>%
arrange(desc(cnt)) %>%
head(10)
现在这个循环给了我想要的输出
for(i in cols){
showTopTenFactors(df, i) %>% print
}
Source: local data frame [3 x 2]
fruit cnt
1 APPLE 49
2 BANANA 30
3 PEAR 21
Source: local data frame [3 x 2]
make cnt
1 HONDA 35
2 TESLA 34
3 FERRARI 31
但是当我尝试用
代替它时lapply(cols, showTopTenFactors, df)
我收到以下错误消息:
Error in UseMethod("group_by_") :
no applicable method for 'group_by_' applied to an object of class "character"
答案 0 :(得分:4)
我认为你实际上不需要创建一个匿名函数。 lapply
应该能够传递参数,只要它被正确命名:
> lapply(cols, showTopTenFactors, x=df)
[[1]]
Source: local data frame [3 x 2]
fruit cnt
1 BANANA 41
2 APPLE 32
3 PEAR 27
[[2]]
Source: local data frame [3 x 2]
make cnt
1 FERRARI 45
2 TESLA 30
3 HONDA 25
您让'cols'值与函数中的x匹配。这不是特定于基于dplyr的函数,而是一个通用的R问题。
答案 1 :(得分:1)
将lapply
语句更改为以下内容应解决此问题:
lapply(cols, FUN= function(x) showTopTenFactors(df, x))
[[1]]
Source: local data frame [3 x 2]
fruit cnt
1 BANANA 36
2 PEAR 36
3 APPLE 28
[[2]]
Source: local data frame [3 x 2]
make cnt
1 HONDA 39
2 TESLA 33
3 FERRARI 28
在apply
语句中,通常在自定义函数中指定参数通常是一种很好的方法。