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

如何在R中基于多日期列保留新冠预警日期前的疫苗数据

R语言处理疫苗接种数据:保留预警日期前的记录

需求说明

你需要保留covid alert date之前的疫苗品牌与接种日期,将该日期之后的相关数据设为NA。以下是针对你的示例数据的两种解决方案,都基于tidyverse工具包,适合新手理解和使用。


步骤1:准备工作

首先确保安装并加载tidyverse包(如果还没安装,先运行install.packages("tidyverse")):

library(tidyverse)

你的示例数据已经定义好,直接使用即可。


方案一:逐剂次手动处理(直观易懂)

这种方法代码直白,适合新手理解每一步的逻辑:

cleaned_data <- sample_data %>%
  rowwise() %>%  # 按行处理数据,确保每一行的预警日期和自身接种日期比较
  mutate(
    # 处理第1剂
    `vax dose 1` = ifelse(`date dose 1` > `covid alert date`, NA, `vax dose 1`),
    `date dose 1` = ifelse(`date dose 1` > `covid alert date`, NA, `date dose 1`),
    # 处理第2剂
    `vax dose 2` = ifelse(!is.na(`date dose 2`) & `date dose 2` > `covid alert date`, NA, `vax dose 2`),
    `date dose 2` = ifelse(!is.na(`date dose 2`) & `date dose 2` > `covid alert date`, NA, `date dose 2`),
    # 处理第3剂
    `vax dose 3` = ifelse(!is.na(`date dose 3`) & `date dose 3` > `covid alert date`, NA, `vax dose 3`),
    `date dose 3` = ifelse(!is.na(`date dose 3`) & `date dose 3` > `covid alert date`, NA, `date dose 3`),
    # 处理第4剂
    `vax dose 4` = ifelse(!is.na(`date dose 4`) & `date dose 4` > `covid alert date`, NA, `vax dose 4`),
    `date dose 4` = ifelse(!is.na(`date dose 4`) & `date dose 4` > `covid alert date`, NA, `date dose 4`),
    # 处理第5剂
    `vax dose 5` = ifelse(!is.na(`date dose 5`) & `date dose 5` > `covid alert date`, NA, `vax dose 5`),
    `date dose 5` = ifelse(!is.na(`date dose 5`) & `date dose 5` > `covid alert date`, NA, `date dose 5`)
  ) %>%
  ungroup()  # 取消行分组,恢复数据框默认结构

逻辑说明:

  • 对每一行的每剂次,判断接种日期是否晚于预警日期:
    • 如果是,将对应的疫苗品牌和接种日期都设为NA
    • 如果不是(包括原本就是NA的情况),保留原数据

方案二:批量处理(简洁高效)

如果以后需要处理更多剂次,这种方法更灵活,不需要重复写代码:

# 定义要处理的剂次范围(1到5)
dose_numbers <- 1:5

cleaned_data <- sample_data %>%
  rowwise() %>%
  mutate(
    # 批量处理所有疫苗品牌列
    across(
      all_of(paste0("vax dose ", dose_numbers)),
      ~ ifelse(get(paste0("date dose ", str_extract(cur_column(), "\\d+"))) > `covid alert date`, NA, .x)
    ),
    # 批量处理所有接种日期列
    across(
      all_of(paste0("date dose ", dose_numbers)),
      ~ ifelse(.x > `covid alert date`, NA, .x)
    )
  ) %>%
  ungroup()

逻辑说明:

  • paste0("vax dose ", dose_numbers)自动生成所有疫苗品牌列名,across函数批量处理这些列
  • str_extract(cur_column(), "\\d+")从当前列名中提取剂次数字,找到对应的接种日期列进行比较
  • 同样,批量处理所有接种日期列,直接判断是否晚于预警日期,是则设为NA

验证结果

你可以通过View(cleaned_data)查看处理后的数据,比如第一行:

  • 预警日期是2022-01-01,第3、4、5剂的接种日期都晚于该日期,所以对应的品牌和日期都被设为NA,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:44:53