如何用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
相关产品推荐
相关产品推荐

