在dplyr的“分组依据和汇总”部分中使用别名列名称

时间:2018-07-31 21:32:23

标签: r dplyr

我有一个数据集,我想在其中仅使用别名作为列名,并将其应用于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

如何使用别名运行此代码?任何帮助将非常感谢!

2 个答案:

答案 0 :(得分:1)

首先需要将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)))

答案 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创建。