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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 13:18:04