如何在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
相关产品推荐
相关产品推荐

