我已经阅读了有关此主题的所有可用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
答案 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