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

在R中为分组时间序列生成距最近感染日的天数变量

解决方案

用dplyr的分组累加逻辑就能解决这个问题,核心是给每个感染事件(包括首次感染)标记分组,然后在每个分组内计算距当前感染的天数。

步骤与代码

首先确保加载tidyverse工具包:

library(tidyverse)

假设你的数据集名为df,执行以下代码:

df <- df %>%
  # 按个体ID和时间点排序,这是时间序列处理的前提
  arrange(ID, timepoint) %>%
  group_by(ID) %>%
  # 标记所有感染事件:首次招募(Recruitment)和后续复染都算
  mutate(
    is_infection = if_else(status == "Recruitment" | infection == 1, 1, 0),
    # 生成感染组ID:每次感染后开启一个新分组
    infection_group = cumsum(is_infection)
  ) %>%
  # 按个体+感染组分组,计算距最近一次感染的天数
  group_by(ID, infection_group) %>%
  mutate(
    # 感染发生的时间点天数为0,后续随访累加距上次的天数
    days_since_last_infection = c(0, cumsum(days_from_previous_round[-1]))
  ) %>%
  ungroup() %>%
  # 可选:清理临时变量
  select(-is_infection, -infection_group)

逻辑说明

  1. 排序:先按ID和timepoint排序,保证时间序列的顺序正确,避免计算出错。
  2. 标记感染事件:is_infection把首次感染(status == "Recruitment")和后续复染(infection == 1)的行标记为1,其他为0。
  3. 生成感染分组:infection_group通过累加is_infection值,给每个感染事件及其后续随访分配同一个组ID——比如首次感染是组1,第一次复染是组2,第二次复染是组3,以此类推。
  4. 计算距最近感染的天数:在每个个体的感染分组内,感染发生的时间点天数设为0,后续随访的天数则累加days_from_previous_round,这样自动实现“复染后重置计数”的需求。

如果没有复染,整个个体只有一个感染分组,计算出的days_since_last_infection会和days_total_length完全一致;如果有多次复染,每次复染后都会重新开始计数,完美匹配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 16:09:54