具有双变量dplyr的函数

具有双变量dplyr的函数,r,dplyr,R,Dplyr,我正在尝试执行以下dplyr任务,但在一个函数中 library("dplyr") iris %>% group_by(Species) %>% summarise(N = sum(Petal.Width == 0.2, na.rm = T)) 我是按照下面的思路思考的,这是不完整的,因为我不清楚语法 getSummary <- function(varName,level) { summary <- iris %>% g

我正在尝试执行以下dplyr任务,但在一个函数中

library("dplyr")

iris %>%
    group_by(Species) %>%
    summarise(N = sum(Petal.Width == 0.2, na.rm = T))
我是按照下面的思路思考的,这是不完整的,因为我不清楚语法

getSummary <- function(varName,level) {
    summary <- iris %>%
        group_by(Species %>%
        summarise_(N = interp(~sum(var == ilevel, na.rm = T), 
                   var = as.name(varName))))
    sums <- summary$N       
}
getSummary%
总结(N=interp(~sum(var==ilevel,na.rm=T),
var=as.name(varName)))

sumsdplyr正在从lazyeval供电的NSE系统切换到。在新版本上(现在通过,很快通过CRAN提供),您可以使用

库(dplyr)
获取摘要%
总结(N=sum(!!varName)==level),#用!!取消引用以使用
var=rlang::quo_text(varName))#将quosure转换为字符串
}
getSummary(花瓣宽度,0.2)
#>#A tibble:3×3
#>种N变种
#>               
#>1刚毛29花瓣宽
#>2花色0花瓣宽度
#>3维吉尼亚0花瓣宽
#或者让它接受字符串
获取摘要%
组别(种类)%>%
总结(N=sum(!!rlang::sym(varName))==level),
var=varName)
}
getSummary('萼片长度',5.0)
#>#A tibble:3×3
#>种N变种
#>                
#>1刚毛8萼片长度
#>2花色2萼片长度
#>3弗吉尼亚0萼片长度
使用旧的lazyeval语法,它看起来像

getSummary%
组别(种类)%>%
总结(N=lazyeval::interp(~sum(x==y))#要替换为的公式
x=lazyeval::lazy(varName),#替换但未赋值的名称
y=级别),#要替换的值
var=~lazyeval::expr_text(varName))#将表达式转换为字符串(相当于'deparse(substitute(…)')`)
}
getSummary(萼片长度,5.0)
#>#A tibble:3×3
#>种N变种
#>                
#>1刚毛8萼片长度
#>2花色2萼片长度
#>3弗吉尼亚0萼片长度
#或者让它接受字符串
获取摘要%
组别(种类)%>%
总结(N=lazyeval::interp(~sum(x==y)),
x=as.name(varName),
y=水平),
var=~varName)
}
getSummary('Petal.Width',0.2)
#>#A tibble:3×3
#>种N变种
#>               
#>1刚毛29花瓣宽
#>2花色0花瓣宽度
#>3维吉尼亚0花瓣宽

您的函数参数是
级别
,但是您在
摘要
中使用
i级别
?您在
分组依据
中缺少括号,您需要返回
摘要
,或者首先不将其作为变量存储。谢谢。关于我的原始问题中语法的任何建议。我不确定如何为varName和level指定类似于“as.name”的内容。在这一点上解释lazyeval的工作方式没有多大意义,但我用它的外观进行了编辑。这解释了一点。底线是,所有内容都必须以公式或其他形式引用,并且要以字符串结束,您需要引用字符串……为了澄清这一点,如果您传递的是变量字符串而不是无引号的表达式,则可能需要
as.name
。rlang等效物是
rlang::sym