R中按分组填充数据框缺失日期 优先用dplyr与管道实现
R语言按分组补全连续日期实现方案
实现逻辑
基于dplyr管道操作配合tidyr的补全函数实现,核心步骤为:
- 先将日期字段转换为标准R语言
Date类型,避免日期序列生成报错 - 以
name、code为分组键拆分数据 - 对每个分组,生成分组内最小日期到最大日期的所有日度连续时间序列,自动补全缺失的日期行
- 新增行的
name、code自动继承分组值,usage、result字段填充为NA - 处理完成后取消分组,避免影响后续操作
完整可运行代码
# 加载依赖包 library(dplyr) library(tidyr) # -------------------- # 此处替换为你自己的数据读取代码 # 以下为匹配需求描述的测试样例数据 df <- tibble( name = c(rep("Jennifer Aniston",3), rep("Matthew Perry",2), rep("Lisa Kudrow",3)), code = c(rep("A001",3), rep("A002",2), rep("A003",3)), date = as.Date(c("2022-05-01","2022-05-02","2022-05-03", "2022-10-01","2022-10-04", "2022-01-02","2022-01-04","2022-01-06")), usage = c(12,15,9,20,18,7,11,6), result = c(89,92,78,85,90,72,88,75) ) # -------------------- # 核心补全逻辑 df_completed <- df %>% mutate(date = as.Date(date)) %>% # 确保日期格式正确,已为Date类型可跳过 group_by(name, code) %>% complete( date = seq.Date(min(date), max(date), by = "day"), fill = list(usage = NA_real_, result = NA_real_) ) %>% ungroup()
效果验证
运行代码后得到的结果完全匹配需求:
- Jennifer Aniston(A001)组日期本身连续,行数无变化
- Matthew Perry(A002)组自动补全2022-10-02、2022-10-03两行,对应usage、result为NA
- Lisa Kudrow(A003)组自动补全2022-01-03、2022-01-05两行,对应usage、result为NA
注意事项
- 若原始
date字段为字符串格式,必须先执行as.Date()转换,否则无法生成正确的连续日期序列 - fill参数中要匹配原字段类型指定NA类型:数值型字段用
NA_real_,字符型字段用NA_character_,避免后续出现类型冲突 - 处理完成后必须执行
ungroup(),否则后续数据操作会保留分组逻辑,容易出现计算错误
内容的提问来源于stack exchange,提问作者Miquel
相关产品推荐
相关产品推荐

