在经典 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
我已经阅读了关于该主题的所有可用的 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