具有双变量dplyr的函数
我正在尝试执行以下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
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
。