如何使用列名作为字符串的整洁评估?

How to use tidy evaluation with column name as strings?

我已经阅读了大部分关于使用 dplyr 进行整洁评估和编程的文档,但无法理解这个(简单的)问题。

我想用 dplyr 编程并将列名作为字符串作为函数的输入。

df <- tibble(
  g1 = c(1, 1, 2, 2, 2),
  g2 = c(1, 2, 1, 2, 1),
  a = sample(5),
  b = sample(5)
)

my_summarise <- function(df, group_var) {
  df %>%
    group_by(group_var) %>%
    summarise(a = mean(a))
}

my_summarise(df, 'g1')

这给了我 Error : Column 'group_var' is unknown.

我必须在 my_summarise 函数内部更改什么才能使其正常工作?

使用 as.name() 将字符串列名转换为裸列名,然后使用新的 {{}}(读作 Curly-Curly)运算符,如下所示:

library(dplyr)

df <- tibble(
  g1 = c(1, 1, 2, 2, 2),
  g2 = c(1, 2, 1, 2, 1),
  a = sample(5),
  b = sample(5)
)

my_summarise <- function(df, group_var) {

  grp_var <- as.name(group_var)

  df %>%
    group_by({{grp_var}}) %>%
    summarise(a = mean(a))
}

my_summarise(df, 'g1')

我们也可以使用 ensym!!

my_summarise <- function(df, group_var) {


  df %>%
    group_by(!!rlang::ensym(group_var)) %>%
    summarise(a = mean(a))
   }

my_summarise(df, 'g1')

或者另一种选择是group_by_at

my_summarise <- function(df, group_var) {


      df %>%
        group_by_at(vars(group_var)) %>%
        summarise(a = mean(a))
       }

my_summarise(df, 'g1')

您还可以使用 sym!!

my_summarise <- function(df, group_var) {


  df %>%
    group_by(!!sym(group_var)) %>%
    summarise(a = mean(a))
   }

my_summarise(df, 'g1')

# A tibble: 2 x 2
     g1     a
  <dbl> <dbl>
1     1  3.5 
2     2  2.67