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

如何在R中实现疾病检测后60天内将rolling_days置0?

解决方案:按分组处理疾病检出后60天的状态标记与rolling_days重置

针对你按site_specific分组的重复测量数据,核心需求是标记出disease_detection=1时及之后60天内的记录,或重置对应区间的rolling_days为0。以下是基于dplyr和lubridate的准确实现方法:

步骤说明

  1. 按分组(site_specific)独立处理每个组的时间逻辑
  2. 基于检测日期(date)排序,确保时间顺序正确
  3. 追踪每个组内所有疾病检出日期,判断每条记录是否落在最近一次检出后的60天窗口内(多次检出时,后续检出会刷新窗口)
  4. 生成状态标识变量,或重置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 00:12:01