R语言dplyr中如何用summarise_at汇总除分组列外的所有列
问题描述
现有数据框包含freq列与若干数量动态变化的整数列,每次运行代码时整数列的数量、列顺序可能发生变动,需要用dplyr实现:按freq分组后,对除freq外所有列计算均值(计算时自动忽略NA值)。
原有代码仅能排除第1列,无法覆盖所有需要计算的目标列,代码如下:
event_data_consumer_1 <- event_data_consumer %>% group_by(freq) %>% summarise_at(-c(1), mean, na.rm = TRUE)
错误原因
原有代码用位置索引-c(1)硬编码排除第1列,仅当freq恰好是数据框第1列时才能正常排除它,且该写法完全无法适配列顺序变动、列数动态增减的场景;同时summarise_at属于dplyr中已标记为待替代的旧版接口,新版更推荐用across()实现跨列计算。
正确写法
推荐写法(dplyr 1.0.0及以上版本通用)
直接通过列名排除freq列,不需要关心列位置、列数量,完全适配动态场景:
event_data_consumer_1 <- event_data_consumer %>% group_by(freq) %>% summarise(across(-freq, ~ mean(.x, na.rm = TRUE)))
如果需要更严谨,只对数值列做计算,可以把选列逻辑改成where(is.numeric),避免非数值列参与计算报错:
event_data_consumer_1 <- event_data_consumer %>% group_by(freq) %>% summarise(across(where(is.numeric) & !freq, ~ mean(.x, na.rm = TRUE)))
旧版本兼容写法
如果使用的dplyr版本低于1.0.0,可沿用summarise_at接口,同样通过列名而非位置选列:
event_data_consumer_1 <- event_data_consumer %>% group_by(freq) %>% summarise_at(vars(-freq), mean, na.rm = TRUE)
核心原则:动态列场景下禁止用位置索引选列,始终通过列名、列属性匹配目标列,才能保证代码在列数、列顺序变动时正常运行。
内容的提问来源于stack exchange,提问作者Ellie S
相关产品推荐
相关产品推荐

