如何在R中按列后缀分组计算多行均值?
批量计算宽格式DataFrame分组行均值
针对你宽格式DataFrame中按后缀(如_0m、_1m)分组的变量,下面提供两种高效的批量计算行均值的方法,无需手动指定每个变量名:
方法1:长格式转换(推荐,可读性强)
这种方法通过宽转长、分组计算均值、长转宽的流程实现,适配所有命名规律统一的分组变量:
library(dplyr) library(tidyr) # 1. 将宽格式转成长格式,拆分变量名为分组与时间后缀 df_long <- df %>% pivot_longer( cols = -ID, names_to = c("group", "time"), names_sep = "_" ) # 2. 按ID和时间分组计算行均值 df_mean <- df_long %>% group_by(ID, time) %>% summarise(row_mean = mean(value, na.rm = TRUE), .groups = "drop") # 3. 转回宽格式,并重命名列匹配你的期望 df_final <- df %>% left_join( df_mean %>% pivot_wider( names_from = time, values_from = row_mean, names_glue = "row_mean_{case_when(time == '0m' ~ '1', time == '1m' ~ '2')}" ), by = "ID" )
运行后df_final会保留原数据列,同时新增row_mean_1(对应_0m组变量的行均值)、row_mean_2(对应_1m组变量的行均值)。如果后续新增_2m、_3m这类时间后缀的变量,只需调整names_glue中的映射规则即可自动适配。
方法2:直接计算行均值(高效,适合大数据集)
如果不想转换数据格式,可结合正则匹配和rowMeans直接批量计算,性能更优:
library(dplyr) library(stringr) library(purrr) # 获取所有唯一的时间后缀(排除ID列) suffixes <- unique(str_extract(names(df)[-1], "_\\d+m$")) # 批量生成行均值列 df_final <- df %>% bind_cols( map_dfc(suffixes, function(suf) { # 筛选对应后缀的变量,计算行均值 rowMeans(df %>% select(matches(str_c("^[A-Z]_", suf))), na.rm = TRUE) %>% as.data.frame() %>% # 按需求命名列:_0m对应row_mean_1,_1m对应row_mean_2 set_names(str_c("row_mean_", ifelse(suf == "_0m", 1, 2))) }) )
补充说明
- 两种方法都支持任意多的分组变量(如A、B、C...)和时间后缀;
na.rm = TRUE参数确保遇到缺失值时仍能计算有效均值;- 方法1逻辑清晰易维护,方法2在大数据集上运行速度更快。
内容的提问来源于stack exchange,提问作者TBP
相关产品推荐
相关产品推荐

