用dplyr按动态列名汇总

13

我正试图在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个回答

16
quo_columnquosure不同,new_colmean_col是字符串,因此我们使用rlang中的sym将其转换为符号,然后进行评估。
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接