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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:15:06