在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)
逻辑说明
- 排序:先按
ID和timepoint排序,保证时间序列的顺序正确,避免计算出错。 - 标记感染事件:
is_infection把首次感染(status == "Recruitment")和后续复染(infection == 1)的行标记为1,其他为0。 - 生成感染分组:
infection_group通过累加is_infection值,给每个感染事件及其后续随访分配同一个组ID——比如首次感染是组1,第一次复染是组2,第二次复染是组3,以此类推。 - 计算距最近感染的天数:在每个个体的感染分组内,感染发生的时间点天数设为0,后续随访的天数则累加
days_from_previous_round,这样自动实现“复染后重置计数”的需求。
如果没有复染,整个个体只有一个感染分组,计算出的days_since_last_infection会和days_total_length完全一致;如果有多次复染,每次复染后都会重新开始计数,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者bellbyrne
相关产品推荐
相关产品推荐

