R语言中如何按省份补全数据框缺失日期并将对应车祸数填0
R 补全省份日期缺失行解决方案
原有代码问题梳理
- 拼写错误:日期构造变量
beign应为begin,分组字段PROVINCES和原数据字段PROVINCE不一致 - 格式不匹配:原数据
DATE列为字符串格式,构造的日期序列为Date类型,关联时无法匹配 - 逻辑缺陷:仅按日期做全连接不会自动为每个省份补全所有日期,需要先生成「省份+日期」的全组合再做匹配
最优实现代码
可以直接用tidyr的complete函数,专门用于补全分组缺失行,代码非常简洁:
# 加载依赖包 library(dplyr) library(tidyr) library(lubridate) # 处理日期,也可以替换为base R的日期函数 # 一步完成格式转换、行补全、缺失值填充 result <- df %>% # 把字符串日期转成标准Date格式,对应格式为日/月/年 mutate(DATE = dmy(DATE)) %>% # 补全每个省份在目标时间范围内的所有日期,缺失的车祸数填充为0 complete( PROVINCE, DATE = seq.Date(from = dmy("01/03/2021"), to = dmy("05/03/2021"), by = "day"), fill = list(CAR_ACCIDENTS = 0) ) %>% # 可选:如果需要输出和原格式一致的字符串日期,转回对应格式 mutate(DATE = format(DATE, "%d/%m/%y"))
运行验证
执行后result就是你需要的10行结果,和示例输出完全一致:
# A tibble: 10 × 3 PROVINCE DATE CAR_ACCIDENTS <chr> <chr> <dbl> 1 AREQUIPA 01/03/21 3 2 AREQUIPA 02/03/21 5 3 AREQUIPA 03/03/21 3 4 AREQUIPA 04/03/21 0 5 AREQUIPA 05/03/21 2 6 SANTA 01/03/21 1 7 SANTA 02/03/21 2 8 SANTA 03/03/21 0 9 SANTA 04/03/21 1 10 SANTA 05/03/21 0
如果不想使用lubridate包,把日期转换部分替换为base R的as.Date指定格式即可:
# 替换日期转换逻辑,无需lubridate mutate(DATE = as.Date(DATE, format = "%d/%m/%y")) # 日期序列构造改为 DATE = seq.Date(from = as.Date("01/03/2021", format = "%d/%m/%Y"), to = as.Date("05/03/2021", format = "%d/%m/%Y"), by = "day")
内容的提问来源于stack exchange,提问作者José Carlos Rojas
相关产品推荐
相关产品推荐

