r - 用 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
. 现在推荐的重新分组方式是什么?
解决方案
原因是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
or.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
推荐阅读
- blockchain - 清除平行链问题
- flutter - Flutter - 使用提供程序从共享首选项中的布尔变量应用主题模式暗/亮
- node.js - 当来自外部域时,Nginx 代理传递有时会失败
- android - 有没有办法改变 Android 12 中启动画面图标的形状?
- doctrine-orm - 学说不断增加内存使用
- reactjs - 使用样式组件时,Webpack 模块联合因 Next JS 失败
- amazon-web-services - 在 Amazon Connect 中访问 Lambda 属性
- python - ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'IBM i Access ODBC Driver 64-bit' : file not found (0) (SQLDriverConnect)") 无
- vue.js - Vue动态组件事件处理程序未触发
- rust - 无法返回对局部变量“s0”的引用