如何使用dplyr填充缺失日期以实现7天时间滞后计算?
解决方法
你可以结合dplyr的行式操作和日期序列生成实现需求,核心代码如下:
首先加载依赖包:
library(dplyr) library(lubridate) library(tidyr)
核心处理逻辑:
# 你的原始数据集构造 date <- c("2004-02-01", "2004-03-05", "2004-08-09", "2004-08-13", "2004-10-20", "2004-11-02", "2008-01-05", "2008-02-03", "2008-08-09", "2008-11-04", "2012-01-05", "2012-02-03", "2012-08-09", "2012-10-04", "2012-10-04", "2012-10-31", "2012-11-04") date <- ymd(date) name <- c("Joe", "Joe", "Joe", "Joe", "Joe", "Joe", "Larry", "Larry", "Larry", "Larry", "Jeff", "Jeff", "Jeff", "Jeff", "Jeff", "Jeff", "Jeff") hits <- c(5, 4, 10, 9, 15, 1, 13, 22, 9, 11, 15, 17, 10, 3, 4, 2, 33) df <- data.frame(date, name, hits) # 生成最终数据集 result <- df %>% rowwise() %>% reframe( name = name, date = seq(from = date, to = date + days(7), by = "1 day"), hits = c(hits, rep(0, 7)) ) %>% ungroup()
说明
rowwise()会按原始数据的每一行单独做处理seq(from = date, to = date + days(7), by = "1 day")会生成包含原始日期在内的连续8天日期(原始日期+后续7天)- hits向量第一位保留原始观测值,后续7位统一填充为0
- 如果你使用的dplyr版本低于1.1.0,不支持
reframe函数,可以改用如下兼容写法:
result <- df %>% rowwise() %>% mutate( date = list(seq(from = date, to = date + days(7), by = "1 day")), hits = list(c(hits, rep(0, 7))) ) %>% unnest(c(date, hits)) %>% ungroup()
可选优化
你的原始数据中存在同name同日期的重复记录(比如Jeff有两条2012-10-04的观测),如果需要合并同一天同用户的hits值,可以在处理逻辑最后加一行聚合代码:
result <- result %>% summarise(hits = sum(hits), .by = c(name, date))
内容的提问来源于stack exchange,提问作者hy9fesh
相关产品推荐
相关产品推荐

