首页 > 解决方案 > 用 group_by(across(...)) 替换 group_by_at(vars(...)) 的规范方法

问题描述

注释的当前文档,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. 现在推荐的重新分组方式是什么?

标签: rdplyrtidyverserlang

解决方案


原因是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"

如果您使用ungroupor.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

推荐阅读