【问题标题】:Use Alias Column Name in Group by and Summarise section for dplyr在 dplyr 的 Group by 和 Summarize 部分中使用别名列名
【发布时间】:2019-01-08 09:10:53
【问题描述】:

我有一个数据集,我想简单地使用列名的别名并将其应用于 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

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

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您也可以更早地将别名放在 quosures 中。脚本版本使用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 年 7 月 31 日创建。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 效果很好,而且很容易实现。谢谢!
      猜你喜欢
      • 2011-04-19
      • 1970-01-01
      • 2021-07-24
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      相关资源
      最近更新 更多