You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用dplyr的across函数替代已弃用的summarise_at实现数据聚合?

用dplyr的across替代弃用函数实现分组聚合

需求说明

原有通过summarise_at和funs实现的分组聚合代码因函数弃用无法运行,现需用dplyr 1.0.10版本的across函数完成相同功能:按id分组,将同一id下的party值按规则拼接(行数≥3用下划线分隔,否则用逗号),对winner值求和。

输入输出示例

输入数据框df_input

df_input <- data.frame(id  = c(1,2,3,4,4,5,5,5,6,7,8,9,10),
                       party = c("A","B","C","D","E","F","G","H","I","J","K","L","M"), 
                       winner= c(1,1,1,1,1,1,1,1,1,1,1,1,1))

期望输出数据框df_output

df_output <- data.frame(id  = c(1,2,3,4,5,6,7,8,9,10),
                        party = c("A","B","C","D,E","F_G_H","I","J","K","L","M"),
                        winner_sum = c(1,1,1,2,3,1,1,1,1,1))  

原弃用代码

df_output <- df_input %>%
  dplyr::group_by_at(.vars = vars(id)) %>%
  {left_join(
    dplyr::summarise_at(., vars(party), ~ str_c(., collapse = ",")),
    dplyr::summarise_at(., vars(winner), funs(sum))
  )} 

错误的across尝试代码

df_output <- df_input %>%
  group_by(id) %>%
  summarise(across(winner, sum, na.rm=T)) %>%
  summarise(across(party, str_c(., collapse = ",")))

报错原因:第一次summarise后仅保留id和winner的求和结果,party列已被丢弃,第二次summarise无法找到party列。

正确实现代码

方式一:直接指定列处理逻辑(更直观)

library(dplyr)
library(stringr)

df_output <- df_input %>%
  group_by(id) %>%
  summarise(
    # 根据分组内行数选择分隔符
    party = str_c(party, collapse = if_else(n() >= 3, "_", ",")),
    winner_sum = sum(winner, na.rm = TRUE)
  ) %>%
  ungroup()

方式二:使用across统一处理

library(dplyr)
library(stringr)

df_output <- df_input %>%
  group_by(id) %>%
  summarise(
    across(party, ~str_c(., collapse = if_else(n() >= 3, "_", ","))),
    # 用.names参数重命名求和后的列
    across(winner, ~sum(., na.rm = TRUE), .names = "{col}_sum")
  ) %>%
  ungroup()

内容的提问来源于stack exchange,提问作者Fuser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 00:20:50