R语言新冠数据集按国家首次确诊日生成条件计数器
R 实现新冠疫情数据集按国家首次确诊日期生成天数计数器
需求说明
处理新冠疫情数据集时,需要为每个国家从首次报告确诊病例(即confirmed字段值为1)的日期开始生成天数计数器,首次确诊当天记为第1天,早于该日期的记录可标记为NA或0。
原有代码问题
原有代码按国家分组后直接取该国家所有记录的最早日期计算天数,没有筛选首次确诊的时间节点,不符合需求:
data1<-data1%>% arrange(country,Date) %>% group_by(Country) %>% mutate(Counter= Date-first(Date)+1)
修正后的实现代码
核心逻辑是在分组后先定位当前国家首次出现确诊为1的日期,再基于该日期计算天数差:
library(dplyr) data1 <- data1 %>% # 先按国家、日期升序排序,保证时间顺序正确 arrange(country, Date) %>% group_by(country) %>% mutate( # 定位当前国家首次确诊为1的行索引 first_case_pos = which(confirmed == 1)[1], # 计算天数,无确诊病例、早于首次确诊日期的记录标记为NA Counter = as.integer(Date - Date[first_case_pos] + 1), Counter = ifelse(Counter < 1 | is.na(first_case_pos), NA, Counter) ) %>% # 可选:删除计算过程中的中间字段 select(-first_case_pos)
效果验证
以提供的示例数据集测试:
- 阿富汗首次确诊出现在第6条记录,对应
Counter值为1,后续记录依次累加为2、3 - 哥伦比亚首次确诊出现在第3条记录,对应
Counter值为1,后续依次累加 - 法国首次确诊出现在第6条记录,对应
Counter值为1,后续依次累加
完全符合预期效果。
示例测试数据集
structure(list(Date = structure(c(1577836800, 1577923200, 1578009600, 1578096000, 1578182400, 1578268800, 1578355200, 1578441600, 1577836800, 1577923200, 1578009600, 1578096000, 1578182400, 1578268800, 1578355200, 1578441600, 1577836800, 1577923200, 1578009600, 1578096000, 1578182400, 1578268800, 1578355200, 1578441600), class = c("POSIXct", "POSIXt" ), tzone = "UTC"), country = c("Afganistan", "Afganistan", "Afganistan", "Afganistan", "Afganistan", "Afganistan", "Afganistan", "Afganistan", "Colombia", "Colombia", "Colombia", "Colombia", "Colombia", "Colombia", "Colombia", "Colombia", "France", "France", "France", "France", "France", "France", "France", "France"), confirmed = c(0, 0, 0, 0, 0, 1, 1, 2, 0, 0, 1, 1, 2, 3, 3, 3, 0, 0, 0, 0, 0, 1, 1, 1)), row.names = c(NA, -24L), class = c("tbl_df", "tbl", "data.frame" ))
内容的提问来源于stack exchange,提问作者Jorge Paredes
相关产品推荐
相关产品推荐

