将参数传递给dplyr函数

我想使用以下参数化以下计算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使用非标准评估,因此此方法会引发错误。该函数应如何编写?


繁花如伊
浏览 682回答 3
3回答

蝴蝶刀刀

像旧的dplyr版本(最高0.5)一样,新的dplyr具有标准评估(SE)和非标准评估(NSE)的功能。但是它们的表达方式与以前不同。如果您需要NSE函数,则可以传递裸表达式,并使用enquo将其捕获为quosure。如果要使用SE函数,只需直接传递量(或符号),然后在dplyr调用中取消引用。这是该问题的SE解决方案:library(tidyverse)library(rlang)f1 <- function(df, grp.var, uniq.var) {&nbsp; &nbsp;df %>%&nbsp; &nbsp; &nbsp; &nbsp;group_by(!!grp.var) %>%&nbsp; &nbsp; &nbsp; &nbsp;summarise(n_uniq = n_distinct(!!uniq.var)) %>%&nbsp; &nbsp; &nbsp; &nbsp;filter(n_uniq > 1)&nbsp;&nbsp;}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小插图进行编程。
打开App,查看更多内容
随时随地看视频慕课网APP