在dplyr中按动态列名称汇总

Joh*_*ley 7 r dplyr

所以我正在尝试在dplyr中进行一些编程,而我在使用enquo时遇到了一些问题!评估.

基本上我想将列变为动态列名,然后能够进一步操作该列(即汇总).例如:

my_function <- function(data, column) {

  quo_column <- enquo(column)

  new_col <- paste0(quo_column, "_adjusted")[2]

  data %>%
     mutate(!!new_col := (!!quo_column) + 1) 
  }

my_function(iris, Petal.Length)
Run Code Online (Sandbox Code Playgroud)

这很好用,并返回一个名为"Petal.Length.adjusted"的列,它只是Petal.Length增加了一个.

但是我似乎无法总结这个新专栏.

my_function <- function(data, column) {

  quo_column <- enquo(column)

   new_col <- paste0(quo_column, "_adjusted")[2]

   mean_col <- paste0(quo_column, "_meanAdjusted")[2]

   data %>%
      mutate(!!new_col := (!!quo_column) + 1) %>%
      group_by(Species) %>%
      summarize(!!mean_col := mean(!!new_col))
}

my_function(iris, Petal.Length)
Run Code Online (Sandbox Code Playgroud)

这会产生一个警告,说明参数"Petal.Length_adjusted"不是数字或逻辑,尽管mutate调用的输出给出了一个数字列.

如何引用此动态生成的列名称以将其传递给更多dplyr函数?

akr*_*run 11

不同于quo_columna quosure,the new_colmean_col是字符串,所以我们使用sym(from rlang)将其转换为符号,然后进行评估

my_function <- function(data, column) {

   quo_column <- enquo(column)

   new_col <- paste0(quo_column, "_adjusted")[2]       

   mean_col <- paste0(quo_column, "_meanAdjusted")[2]

   data %>%
      mutate(!!new_col := (!!quo_column) + 1)  %>%
      group_by(Species) %>%
      summarise(!!mean_col := mean(!! rlang::sym(new_col)))
}

head(my_function(iris, Petal.Length))
# A tibble: 3 x 2
#  Species    Petal.Length_meanAdjusted
#  <fct>                          <dbl>
#1 setosa                          2.46
#2 versicolor                      5.26
#3 virginica                       6.55
Run Code Online (Sandbox Code Playgroud)