为了账号安全,请及时绑定邮箱和手机立即绑定

将参数传递给dplyr函数

将参数传递给dplyr函数

繁花如伊 2019-10-09 15:46:23
我想使用以下参数化以下计算dplyr,该计算查找哪些值Sepal.Length与多个值相关联Sepal.Width:library(dplyr)iris %>%    group_by(Sepal.Length) %>%    summarise(n.uniq=n_distinct(Sepal.Width)) %>%    filter(n.uniq > 1)通常我会这样写:not.uniq.per.group <- function(data, group.var, uniq.var) {    iris %>%        group_by(group.var) %>%        summarise(n.uniq=n_distinct(uniq.var)) %>%        filter(n.uniq > 1)}但是,由于dplyr使用非标准评估,因此此方法会引发错误。该函数应如何编写?
查看完整描述

3 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

像旧的dplyr版本(最高0.5)一样,新的dplyr具有标准评估(SE)和非标准评估(NSE)的功能。但是它们的表达方式与以前不同。


如果您需要NSE函数,则可以传递裸表达式,并使用enquo将其捕获为quosure。如果要使用SE函数,只需直接传递量(或符号),然后在dplyr调用中取消引用。这是该问题的SE解决方案:


library(tidyverse)

library(rlang)


f1 <- function(df, grp.var, uniq.var) {

   df %>%

       group_by(!!grp.var) %>%

       summarise(n_uniq = n_distinct(!!uniq.var)) %>%

       filter(n_uniq > 1)  

}


a <- f1(iris, quo(Sepal.Length), quo(Sepal.Width))

b <- f1(iris, sym("Sepal.Length"), sym("Sepal.Width"))

identical(a, b)

#> [1] TRUE

注意SE版本如何使您可以使用字符串参数-只需先使用将它们转换为符号即可sym()。有关更多信息,请参见使用dplyr小插图进行编程。


查看完整回答
反对 回复 2019-10-09
  • 3 回答
  • 0 关注
  • 679 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信