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

如何在R中基于ID合并数据框行并保留状态信息?

解决按ID合并行并保留状态信息的问题

你遇到的问题很典型:unique()函数只会移除完全重复的整行,但你的同一ID下的行有不同的Event_Date或状态值(比如COPD从0变1),所以整行并不重复,unique()自然无法合并。要实现你的需求,我们需要按ID分组,对每个列单独做聚合处理,保留你需要的状态信息。

方法1:使用dplyr(tidyverse风格)

这是最直观的方式,适合数据量不大的情况:

首先确保你安装并加载了dplyr包:

install.packages("dplyr")
library(dplyr)

然后按ID分组,对每列做对应的聚合操作:

# 假设你的原始数据框名为Data
cleaned_data <- Data %>%
  group_by(ID) %>%
  summarise(
    Smoker = max(Smoker, na.rm = TRUE),  # 取最终状态(0→1,最大值就是最新状态)
    Asthma = max(Asthma, na.rm = TRUE),
    Age = first(Age),  # 同一ID的Age应该一致,取首个值即可
    Sex = first(Sex),
    COPD = max(COPD, na.rm = TRUE),      # 保留COPD的最终状态
    Event_Date = min(Event_Date, na.rm = TRUE)  # 取最早的事件日期(和你的预期结果匹配)
  ) %>%
  ungroup()

注意事项:日期格式处理

如果你的Event_Date是字符型(比如"12-2009"),直接用min()可能得不到正确的日期顺序,需要先转换为日期类型:

# 先把字符型日期转为Date类型(假设日是当月1号)
Data$Event_Date <- as.Date(paste0("01-", Data$Event_Date), format = "%d-%m-%Y")

# 聚合后如果需要转回原格式:
cleaned_data$Event_Date <- format(cleaned_data$Event_Date, "%m-%Y")

方法2:使用data.table(适合大数据集)

如果你的数据量很大,data.table的速度会更快:

install.packages("data.table")
library(data.table)

setDT(Data)  # 将数据框转为data.table格式
cleaned_data <- Data[, .(
  Smoker = max(Smoker, na.rm = TRUE),
  Asthma = max(Asthma, na.rm = TRUE),
  Age = first(Age),
  Sex = first(Sex),
  COPD = max(COPD, na.rm = TRUE),
  Event_Date = min(Event_Date, na.rm = TRUE)
), by = ID]

为什么这个方法有效?

  • 我们按ID分组后,对状态类列(Smoker、Asthma、COPD)取最大值,这样就能保留从0到1的状态变化结果(如果有过1,最大值就是1);
  • 对Age、Sex这类同一ID下不会变化的列,取首个值或唯一值即可;
  • 对Event_Date取最小值,得到该ID最早的事件日期,和你的预期结果一致。

内容的提问来源于stack exchange,提问作者Beum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:12:46