按 dplyr 中的动态列名汇总

Posted

技术标签:

【中文标题】按 dplyr 中的动态列名汇总【英文标题】:Summarizing by dynamic column name in 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 函数?

【问题讨论】:

【参考方案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

【讨论】:

以上是关于按 dplyr 中的动态列名汇总的主要内容,如果未能解决你的问题,请参考以下文章

如何将 dplyr 中的动态列名传递给自定义函数?

ifelse 按 r 中的列位置 - 列名未知 [重复]

在数据框中动态添加列,列名作为 List 中的元素

使用dplyr汇总多个列的不同操作

R:dplyr 有条件地汇总并重新编码列中的值

游标 PLSQL 中的动态列名