我有一个数据集,我想在其中仅使用别名作为列名,并将其应用于dplyr group_by / summarise函数。
这里是一个例子。
alias = 'cust'
alias2 = 'class'
df <- data_frame(cust = c("A", "B", "A", "C", "B"), class = c(1, 2, 3, 4, 7))
df
cust class
<chr> <dbl>
1 A 1
2 B 2
3 A 3
4 C 4
5 B 7
这是原始的dplyr函数:
df %>%
dplyr::group_by(cust) %>%
dplyr::summarise(test = max(class) )
结果:
cust test
<chr> <dbl>
1 A 3
2 B 7
3 C 4
这是我的别名尝试:
df %>%
dplyr::group_by(!!alias) %>%
dplyr::summarise(test = max(!!alias2) )
`"cust"` test
<chr> <chr>
1 cust class
如何使用别名运行此代码?任何帮助将非常感谢!
答案 0 :(得分:1)
首先需要将alias
和alias2
转换为列名称符号:
library(dplyr); library(rlang);
df %>%
group_by(!!sym(alias)) %>%
summarise(test = max(!!sym(alias2)))
# A tibble: 3 x 2
# cust test
# <chr> <dbl>
#1 A 3
#2 B 7
#3 C 4
group_by
也有一个group_by_at
变体,可以直接与字符向量一起使用:
df %>%
group_by_at(alias) %>%
summarise(test = max(!!sym(alias2)))
答案 1 :(得分:0)
您也可以将别名放在quasure中。使用quo
作为脚本版本,如果将enquo
放在函数中,则使用:
library(tidyverse)
alias = quo(cust)
alias2 = quo(class)
df <- data_frame(cust = c("A", "B", "A", "C", "B"), class = c(1, 2, 3, 4, 7))
df %>%
group_by(!!alias) %>%
summarise(test = max(!!alias2))
#> # A tibble: 3 x 2
#> cust test
#> <chr> <dbl>
#> 1 A 3
#> 2 B 7
#> 3 C 4
max_summary <- function(df, group_col, max_col) {
alias <- enquo(group_col)
alias2 <- enquo(max_col)
df %>%
group_by(!!alias) %>%
summarise(test = max(!!alias2))
}
max_summary(df, cust, class)
#> # A tibble: 3 x 2
#> cust test
#> <chr> <dbl>
#> 1 A 3
#> 2 B 7
#> 3 C 4
由reprex package(v0.2.0)于2018-07-31创建。