使用字符串作为输入的dplyr编程
我想写一个在内部使用dplyr的函数,并提供变量名作为字符串。不幸的是,dplyr-s对NSE的使用使其变得相当复杂。从中我得到了下面的例子使用字符串作为输入的dplyr编程,r,dplyr,R,Dplyr,我想写一个在内部使用dplyr的函数,并提供变量名作为字符串。不幸的是,dplyr-s对NSE的使用使其变得相当复杂。从中我得到了下面的例子 my_summarise <- function(df, var) { var <- enquo(var) df %>% group_by(!!var) %>% summarise(a = mean(a)) } my_summarise(df, g1) 我的总结% 总结(a=平均值(a)) } 我的总结
my_summarise <- function(df, var) {
var <- enquo(var)
df %>%
group_by(!!var) %>%
summarise(a = mean(a))
}
my_summarise(df, g1)
我的总结%
总结(a=平均值(a))
}
我的总结(df,g1)
然而,我想写一个函数,在这里我可以提供
“g1”
,而不是g1
,我不知道该怎么做 据我所知,您可以使用As.name
或sym
(来自rlang
软件包-我不知道dplyr
是否最终会导入它):
库(dplyr)
我的总结%
总结(mpg=平均值(mpg))
}
或
我的总结%
总结(mpg=平均值(mpg))
}
我的总结(mtcars,“共青团”)
##A tibble:3×2
#共青团
#
# 1 4 26.66364
# 2 6 19.74286
# 3 8 15.10000
使用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
我的总结%
分组依据(.data[[var]])%>%
总结(mpg=平均值(mpg))
}
我的总结(mtcars,“共青团”)
#一个tibble:3x2
共青团
1 4 26.7
2 6 19.7
3 8 15.1
这是如何仅使用dplyr
和base 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")
my_summary只需使用group_by
而不是group_by
,您不需要任何enquo
内容。我知道您的示例取自您链接的文档(似乎是由权威来源编写的),但是我不得不说,使用groupby
作为参数的名称似乎很糟糕,该参数将传递给同名函数。请通读lazyeval
包vignette或。但是NSE是默认的,需要所有引用/公式的东西。如果要使用字符串列名,则这是标准求值,并且需要使用所有NSE对应项下的标准求值函数,group\u by
,summary\u
,等等。现在所有的*.
似乎都被弃用了,我想知道什么是正确的方法。嗯,我明白了。这很令人失望,似乎就在2-3年前,lazyeval
还是一个新事物,是“正确的方法”,我知道发生了什么。
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
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")