使用字符串作为输入的dplyr编程

使用字符串作为输入的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)) } 我的总结

我想写一个在内部使用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))
}
我的总结(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")