首页 文章

在dplyr中按动态列名称汇总

提问于
浏览
7

所以我正在尝试在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)

这很好用,并返回一个名为“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)

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

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

1 回答

  • 10

    与作为 quosurequo_column 不同, new_colmean_col 是字符串,因此我们使用 sym (来自 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
    

相关问题