如何在R中实现疾病检测后60天内将rolling_days置0?
解决方案:按分组处理疾病检出后60天的状态标记与rolling_days重置
针对你按site_specific分组的重复测量数据,核心需求是标记出disease_detection=1时及之后60天内的记录,或重置对应区间的rolling_days为0。以下是基于dplyr和lubridate的准确实现方法:
步骤说明
- 按分组(
site_specific)独立处理每个组的时间逻辑 - 基于检测日期(
date)排序,确保时间顺序正确 - 追踪每个组内所有疾病检出日期,判断每条记录是否落在最近一次检出后的60天窗口内(多次检出时,后续检出会刷新窗口)
- 生成状态标识变量,或重置
rolling_days
完整代码
# 加载必要工具包 library(dplyr) library(lubridate) # 处理数据(替换your_data为你的实际数据对象) processed_data <- your_data %>% # 按分组拆分数据 group_by(site_specific) %>% # 按检测日期排序,保证时间顺序正确 arrange(date, .by_group = TRUE) %>% mutate( # 收集当前组内所有疾病检出的日期 detection_dates = list(date[disease_detection == 1]), # 找到当前记录日期之前最近的一次检出日期 last_detection = if (length(detection_dates[[1]]) > 0) { max(detection_dates[[1]][detection_dates[[1]] <= date]) } else { NA }, # 生成Yes/No状态变量:标记是否在检出后60天内 in_60day_window = case_when( !is.na(last_detection) & date <= last_detection + days(60) ~ "Yes", TRUE ~ "No" ), # 重置rolling_days:窗口内的记录置0,其余保留原值 rolling_days_updated = ifelse(in_60day_window == "Yes", 0, rolling_days) ) %>% # 清理临时变量 select(-detection_dates, -last_detection) %>% # 取消分组 ungroup()
关键细节
- 若某个分组无疾病检出记录,所有记录的
in_60day_window会标记为No,rolling_days_updated保留原始值 - 多次检出场景下,后续检出会覆盖之前的窗口(比如第一次检出后50天再次检出,新窗口从第二次检出日期开始计算60天)
- 日期判断包含检出当天及之后第60天的记录
内容的提问来源于stack exchange,提问作者Levi M
相关产品推荐
相关产品推荐

