用dplyr编程0.3

时间:2014-11-12 20:16:01

标签: r functional-programming dplyr

我正在尝试使用新的下划线函数对标准评估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"

2 个答案:

答案 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语句中,通常在自定义函数中指定参数通常是一种很好的方法。