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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:09:23