Sum Dplyr函数在经典R函数内(n()工作,但不是总和!)

时间:2015-08-14 17:22:37

标签: r function dplyr

我已经阅读了有关此主题的所有可用SOF主题。无法解决我的问题。我想构建一个数据集名称,变量名称和组名称作为参数的函数。我想使用dplyr函数summary,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 

1 个答案:

答案 0 :(得分:4)

正如威德利指出的那样,这一切都在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