我在功能中混合SE和NSE dplyr评估时遇到困难。 我有一个数据集,我想根据不同列上的出现次数划分每列。
让我用我之后的功能写一个小函数
func <- function(param) {
mtcars %>%
group_by(cyl) %>%
summarise_each(funs_(lazyeval::interp(~sum(.))/lazyeval::interp(~sum(var ==
0), var = as.name(param))))
}
将使用func(am)
或func(vs)
我已尝试过该功能的各种替代方案,但没有一种可行。
我缺少什么?
答案 0 :(得分:2)
在这种情况下,需要在其标准评估版(funs
)中使用funs_
。此外,整个公式只需一次调用interp
。例如:
func <- function(param, data=mtcars) {
data %>%
group_by(cyl) %>%
summarise_each(funs_(lazyeval::interp(~sum(.)/sum(.[var==0]), var = as.name(param))))
}
func("vs")
cyl mpg disp hp drat wt qsec vs am gear carb 1 4 11.28077 9.613466 9.989011 10.108352 11.749065 12.605389 Inf Inf Inf Inf 2 6 2.23987 2.759570 2.167089 2.197898 2.640048 2.569212 Inf Inf Inf Inf 3 8 1.00000 1.000000 1.000000 1.000000 1.000000 1.000000 NaN NA NA NA
或者,更通用的功能:
func <- function(param, param.subset, groupvar, data) {
data %>%
group_by_(groupvar) %>%
summarise_each(funs_(lazyeval::interp(
~if(is.numeric(.)) {
sum(.[var==param.subset])/sum(.)
} else {
length(unique(.[var==param.subset]))
}, var = as.name(param))))
}
func(param="gender", param.subset="Girl", groupvar="grade", data=vcd::JointSports)
grade Freq opinion year gender 1 1st 0.5866477 5 2 1 2 3rd 0.6137566 5 2 1
我仍然觉得我真的没有&#34;得到&#34;使用dplyr进行标准评估,并对是否有比上述代码更好的方法感兴趣。