【问题标题】:Summarizing by dynamic column name in dplyr按 dplyr 中的动态列名汇总
【发布时间】:2018-11-05 07:45:44
【问题描述】:

所以我正在尝试在 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 函数?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    quo_columnquosure)不同,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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 2019-01-27
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多