R语言如何识别行内重复Gest值并替换关联值为均值重排数据
宽格式重复孕周数据按行聚合处理方案
现有公开的同类问题解决方案均无法适配当前数据集,示例数据构造代码如下:
ID <- c(27,46,72) Gest1 <- c(27,28,29) Sys1 <- c(120,123,124) Dia1 <- c(90,89,92) Gest2 <- c(29,28,30) Sys2 <- c(122,130,114) Dia2 <- c(89,78,80) Gest3 <- c(32,29,30) Sys3 <- c(123,122,124) Dia3 <- c(90,88,89) Gest4 <- c(33,30,32) Sys4 <- c(124,123,128) Dia4 <- c(94,89,80) df.1 <- data.frame(ID,Gest1,Sys1,Dia1,Gest2,Sys2,Dia2,Gest3,Sys3, Dia3,Gest4,Sys4,Dia4)
处理需求
- 逐行识别所有以
Gest开头的孕周变量中的重复值 - 对重复
Gest值关联的Sys、Dia变量计算均值 - 同值重复的
Gest组仅保留1条记录,对应Sys、Dia值替换为计算所得均值,删除冗余重复记录后,后续列依次前移填充空位;方案需适配25组Gest/Sys/Dia配对变量的处理规模
实现代码
采用宽转长-聚合-长转宽的逻辑,无需手动指定变量组数,自动适配符合命名规则的任意数量三联变量:
library(dplyr) library(tidyr) df_processed <- df.1 %>% # 宽格式转长格式,自动识别Gest/Sys/Dia三类变量 pivot_longer( cols = -ID, names_to = c(".value", "seq"), names_pattern = "(Gest|Sys|Dia)(\\d+)" ) %>% # 过滤缺失值 filter(!is.na(Gest)) %>% # 按ID、孕周分组,计算重复孕周对应的血压均值 group_by(ID, Gest) %>% summarise( Sys = mean(Sys, na.rm = T), Dia = mean(Dia, na.rm = T), .groups = "drop" ) %>% # 为去重后的记录生成新的序号 group_by(ID) %>% mutate(new_seq = row_number()) %>% ungroup() %>% # 长格式转回宽格式,自动生成对应列 pivot_wider( id_cols = ID, names_from = new_seq, values_from = c(Gest, Sys, Dia), names_glue = "{.value}{new_seq}" ) %>% # 调整列顺序,保持Gest+Sys+Dia依次排列的原结构 select(ID, order(gsub("\\d+", "", names(.)[-1])) + 1)
效果说明
代码运行后自动完成所有处理逻辑:以示例数据中ID=46的记录为例,原Gest1、Gest2均为28,对应Sys均值为(123+130)/2=126.5、Dia均值为(89+78)/2=83.5,去重后该条记录仅保留1个孕周28的条目,后续孕周记录依次前移,与预期结果完全一致。
该方案不限制Gest/Sys/Dia的组数,只要变量名遵循「前缀+数字」的命名规则,25组甚至更多组的数据都可以直接运行,无需修改代码逻辑。
内容的提问来源于stack exchange,提问作者19056530
相关产品推荐
相关产品推荐

