按 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_column
(quosure
)不同,new_col
和mean_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 中的动态列名汇总的主要内容,如果未能解决你的问题,请参考以下文章