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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:21:20