首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dplyr混合SE和NSE

dplyr混合SE和NSE
EN

Stack Overflow用户
提问于 2017-03-02 03:21:56
回答 1查看 152关注 0票数 1

我在一个函数中混合使用SE和NSE dplyr评估有困难。我有一个数据集,我想根据在不同列上出现的次数来划分每一列。

让我用我想要的功能写一个小函数

代码语言:javascript
复制
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)

我已经尝试了该函数的各种替代方案,但都不起作用。

我错过了什么?

EN

回答 1

Stack Overflow用户

发布于 2017-03-02 06:08:18

在这种情况下,需要在其标准评估版本(funs_)中使用funs。此外,整个公式都包含在对interp的一个调用中。例如:

代码语言:javascript
复制
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

或者,一个更通用的函数:

代码语言:javascript
复制
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

我仍然觉得我并没有真正“得到”dplyr的标准评估,而是对是否有比上面的代码更好的方法感兴趣。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42540233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档