我想写一个在内部使用dplyr的函数,我提供变量名作为字符串。不幸的是,dplyr-s使用NSE使它变得相当复杂。从Programming with dplyr我得到以下示例
my_summarise <- function(df, var) {
var <- enquo(var)
df %>%
group_by(!!var) %>%
summarise(a = mean(a))
}
my_summarise(df, g1)
但是,我想编写函数而不是g1
我可以提供"g1"
而我无法解决如何做到这一点。
答案 0 :(得分:10)
Afaik,您可以使用as.name
或sym
(来自rlang
套餐 - 如果dplyr
最终导入它,我就不知道了):
library(dplyr)
my_summarise <- function(df, var) {
var <- rlang::sym(var)
df %>%
group_by(!!var) %>%
summarise(mpg = mean(mpg))
}
或
my_summarise <- function(df, var) {
var <- as.name(var)
df %>%
group_by(!!var) %>%
summarise(mpg = mean(mpg))
}
my_summarise(mtcars, "cyl")
# # A tibble: 3 × 2
# cyl mpg
# <dbl> <dbl>
# 1 4 26.66364
# 2 6 19.74286
# 3 8 15.10000
答案 1 :(得分:0)
使用 rlang 中的.data
代词是另一种直接与存储为字符串的列名一起使用的选项。
带有.data
的函数看起来像
my_summarise <- function(df, var) {
df %>%
group_by(.data[[var]]) %>%
summarise(mpg = mean(mpg))
}
my_summarise(mtcars, "cyl")
# A tibble: 3 x 2
cyl mpg
<dbl> <dbl>
1 4 26.7
2 6 19.7
3 8 15.1
答案 2 :(得分:0)
我发现自己正为同样的问题而苦苦挣扎。最后,这是仅使用dplyr
和基数R中非常有用的as.name
函数来完成此操作的方法:
my_summarise <- function(df, var) {
varName <- as.name(var)
enquo_varName <- enquo(varName)
df %>%
group_by(!!enquo_varName) %>%
summarise(a = mean(a))
}
my_summarise(df, "g1")
基本上,我们使用as.name()
生成一个与var
匹配的名称对象(此处var
是一个字符串)。然后,在Programming with dplyr之后,我们使用enquo()
查看该名称并返回相关的值作为quosure。然后可以使用group_by()
在!!
调用中取消引用此报价。