我想使用以下参数化以下计算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小插图进行编程。
- 3 回答
- 0 关注
- 679 浏览
添加回答
举报
0/150
提交
取消