通过 dplyr 中的动态列名进行汇总

2024-02-04

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


不像quo_column这是一个quosure, the new_col and mean_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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 dplyr 中的动态列名进行汇总 的相关文章

随机推荐