在R中重构JHU疫情时间序列数据框 实现分国家日新增病例统计
解决方法
JHU疫情仓库的原始数据为累计确诊数,你现有代码输出的是各国每日累计值,只需增加按国家分组差分的逻辑即可得到日新增数据,调整后的完整代码如下:
library(dplyr) library(tidyr) library(lubridate) result <- originaldf %>% # 剔除不需要的经纬度列 select(-c(Lat, Long)) %>% # 宽表转换为长表 pivot_longer(cols = -`Country/Region`, names_to = 'Date', values_to = 'Cases') %>% # 按国家、日期聚合,处理同一国家多行政区的累计数据 group_by(`Country/Region`, Date = mdy(Date)) %>% summarise(Cumulative_Cases = sum(Cases, na.rm = TRUE), .groups = 'drop') %>% # 按国家单独分组,按日期升序排序 group_by(`Country/Region`) %>% arrange(Date, .by_group = TRUE) %>% # 计算日新增:当日累计减去前一日累计,首日新增默认取当日累计值 mutate(Cases = Cumulative_Cases - lag(Cumulative_Cases, n = 1, default = 0)) %>% # 可选步骤:处理数据回溯修正导致的新增为负的异常,不需要可删除 mutate(Cases = pmax(Cases, 0)) %>% # 保留最终需要的字段 select(`Country/Region`, Date, Cases) %>% ungroup()
关键逻辑说明
- 先聚合得到各国每日累计确诊数,避免直接差分导致多行政区数据计算错误
- 仅按国家分组后做日期排序,保证差分计算是同一个国家不同日期的数值相减
lag()函数的default = 0参数保证每个国家第一天的新增值计算正确- 可选的
pmax(Cases, 0)用来过滤官方数据修正产生的负新增值,如需要保留原始修正结果可删除该行
内容的提问来源于stack exchange,提问作者José Carlos Rojas
相关产品推荐
相关产品推荐

