在经典 R 函数中对 Dplyr 函数求和(n() 有效但不能求和!)

Sum Dplyr Function inside a classical R Function (n() work but not sum!)

我已经阅读了关于该主题的所有可用的 SOF 线程。无法解决我的问题。我想构建一个以数据集名称、变量名称和组名称作为参数的函数。我想使用 dplyr 函数 summarize、sum 和 n()。当我只放 n() 时似乎一切都很好。但是当我想计算每个组内的总和时,一切都失败了。

这是我的函数:

library(MASS)
library(ISLR)

dplyrfun <- function(dataframe, variable1,variable2){
  dataframe %>% 
    group_by_(variable1) %>% 
    summarise_(
      freq = ~n(),
      freq_weighted = ~sum(variable2)
    )
}

所以当我执行这个命令时:

dplyrfun(Boston, ~rad,~age)

我收到此错误消息:

Error in sum(~c(65.2, 9.9, 18.8, 32, 19.1, 24.8, 20.8, 31.9, 31.5, 28.4,  : 
  invalid 'type' (language) of argument 

正如 hadley 指出的那样,这一切都在 dplyr NSE vignette 中。使用 lazyeval::interp():

library(MASS)
library(ISLR)
library(dplyr)
library(lazyeval)

dplyrfun <- function(dataframe, variable1, variable2){
  dataframe %>% 
    group_by_(interp(~ var, var = as.name(variable1))) %>% 
    summarise_(
      freq = ~n(),
      freq_weighted = interp(~ sum(var), var = as.name(variable2))
    )
}

但是您需要将列名放在引号中:

dplyrfun(Boston, "rad", "age")
Source: local data frame [9 x 3]

  rad freq freq_weighted
1   1   20         900.5
2   2   24        1554.5
3   3   38        1873.8
4   4  110        6692.6
5   5  115        7960.7
6   6   26        1563.7
7   7   17         682.4
8   8   24        1616.4
9  24  132       11854.3

并且只是为了检查:

identical(
  dplyrfun(Boston, "rad", "age"),
  Boston %>%
    group_by_(~ rad) %>%
    summarise_(
      freq = ~n(),
      freq_weighted = ~ sum(age)
    )
)

[1] TRUE