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

在R语言中基于状态条件合并数据框行的实现需求及问题求助

在R语言中基于状态条件合并数据框行的实现需求及问题求助

大家好,我最近在处理一份患者随访数据时遇到了难题,想请教一下社区里的大神们。我手头有个包含5列的数据集,分别记录了患者姓名、两次随访的时间点,以及对应每次随访的患者状态,所有列都是一一对应的。

先给大家看看我的数据集:

df <- data.frame(
  Patient = c('Dave', 'Dave', 'Dave','Dave','Dave','Dave','Dave', "Angel", "Angel", "Angel", "Cara", "Cara"),
  V1 = c(1, 150, 240,430,530,650,800, 1, 150, 375, 1, 150),
  V2 = c(150, 240,430,530,650,800,900, 150, 375, 568, 150,375),
  R1 = c("Disease","Disease","Disease","Response","Response","Disease","Response", "Disease","Response", "Response", "Disease", "Response"),
  R2 = c("Disease", "Disease", "Response","Response","Disease","Response","Response", "Response", "Response", "Response", "Response", "Death")
)

我的需求是:针对每个患者,合并连续状态相同的行,直到状态发生变化。最终的数据集需要保留所有R1 ≠ R2的行,除非是该患者的最后一条记录——哪怕最后一条记录的R1=R2,只要它的前一行有状态变化,也需要保留。

大概的逻辑我用伪代码写出来了,供大家参考:

if (R1 == R2 且 当前不是该患者的最后一条记录) {
    记录当前行的V1和R1
    继续遍历后续行,直到遇到R1≠R2的行,或者到该患者的最后一条记录
    记录此时的V2和R2
    输出这条合并后的行
}

当然我不局限于用循环实现,任何能达到目标的方法都可以。

我期望得到的最终数据集是这样的:

PatientV1V2R1R2
Dave1430DiseaseResponse
Dave430650ResponseDisease
Dave650800DiseaseResponse
Dave800900ResponseResponse
Angel1568DiseaseResponse
Cara1150DiseaseResponse
Cara150375ResponseDeath

我之前参考其他帖子写了一段代码,但结果和预期的不完全匹配,还需要调整。代码如下:

library(tidverse)

df %>%
  group_by(Patient) %>%
  mutate(patient_id = row_number()) %>%
  filter(R1 != R2 | patient_id == max(patient_id)) %>%
  mutate(V1 = ifelse(patient_id == min(patient_id), 1, V1)) %>%
  ungroup %>% select(-patient_id)

现在的问题是,我需要确保只有当最后一条记录的前一行存在状态变化(也就是R1≠R2)时,才保留R1=R2的最后一条记录。

希望大家能帮我看看怎么修改这段代码,或者有没有其他更合适的实现方式,谢谢大家!

备注:内容来源于stack exchange,提问作者rstudio_noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 09:28:11