r-在dplyr的Group by and Summarise部分中使用别名列名



我有一个数据集,我想简单地使用别名作为列名,并将其应用于dplyr group_by/summary函数。

下面是一个例子。

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

如何使用别名运行此代码?任何帮助都将不胜感激!

您需要首先将aliasalias2转换为列名符号:

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)))

您也可以早些时候将别名放在quoures中。脚本版本使用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

创建于2018-07-31由reprex包(v0.2.0(。

最新更新