【问题标题】:canonical way of replacing group_by_at(vars(...)) by group_by(across(...))用 group_by(across(...)) 替换 group_by_at(vars(...)) 的规范方法
【发布时间】:2023-03-11 08:53:02
【问题描述】:

group_by_at 的当前文档指出,_at 函数已被使用 across 取代。 但是,across 在我尝试时失败 恢复原始分组,因为它忽略了当前的分组列。

do_with_cut <- function(df) {
  groupVarsOrig <- group_vars(df)
  df %>% 
    group_by(.data$cut, .add = TRUE) %>% 
    summarise(price = mean(price)) %>% 
    #group_by_at(vars(groupVarsOrig)) # marked as superseded
    #group_by(across(groupVarsOrig)) # fails for missing column color
    ungroup() %>% group_by(across(groupVarsOrig))
}

ggplot2::diamonds %>% 
  group_by(color) %>% 
  do_with_cut()

为了避免这些错误重新分组与未知先前分组的小标题 我必须先ungroup

但是,在我看来,总是在group_by(across(...)) 前面加上ungroup() 似乎不是替换group_by_at 的明确方法。现在推荐的重新分组方式是什么?

【问题讨论】:

    标签: r dplyr tidyverse rlang


    【解决方案1】:

    原因是在summarise 之后,它只删除最后一组,即cut,因此您的数据已经按color 分组,因此它找不到color 列。见:

    do_with_cut <- function(df) {
      groupVarsOrig <- group_vars(df)
      df %>% 
        group_by(.data$cut, .add = TRUE) %>% 
        summarise(price = mean(price)) 
    }
    
    ggplot2::diamonds %>% 
      group_by(color) %>% 
      do_with_cut() -> data
    
    group_vars(data)
    #[1] "color"
    

    如果您使用 ungroup.groups 参数删除所有先前的分组,那么它会按预期工作。

    do_with_cut <- function(df) {
      groupVarsOrig <- group_vars(df)
      df %>% 
        group_by(.data$cut, .add = TRUE) %>% 
        summarise(price = mean(price), .groups = 'drop') %>%
        group_by(across(groupVarsOrig))
    }
    
    ggplot2::diamonds %>% 
      group_by(color) %>% 
      do_with_cut() 
    
    # A tibble: 35 x 3
    # Groups:   color [7]
    #   color cut       price
    #   <ord> <ord>     <dbl>
    # 1 D     Fair      4291.
    # 2 D     Good      3405.
    # 3 D     Very Good 3470.
    # 4 D     Premium   3631.
    # 5 D     Ideal     2629.
    # 6 E     Fair      3682.
    # 7 E     Good      3424.
    # 8 E     Very Good 3215.
    # 9 E     Premium   3539.
    #10 E     Ideal     2598.
    # … with 25 more rows
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-28
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      • 2013-01-14
      • 1970-01-01
      • 2016-09-20
      • 1970-01-01
      相关资源
      最近更新 更多