Как использовать аккуратную оценку с именем столбца в качестве строки? - PullRequest
1 голос
/ 21 апреля 2020

Я прочитал большую часть документации об оценке и программировании с помощью 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, чтобы эта работа работала?

Ответы [ 3 ]

2 голосов
/ 21 апреля 2020

Мы также можем использовать 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')
2 голосов
/ 21 апреля 2020

Преобразуйте имя строкового столбца в пустое имя столбца, используя as.name(), а затем используйте новый оператор {{}} (read 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')
1 голос
/ 22 апреля 2020

Вы также можете использовать 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
...