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

如何在dplyr的mutate中递归填充日期NA值?

用dplyr填充日期列中的连续NA值

你有如下日期数据:

library(lubridate)
library(dplyr)
aa <- tibble(date = ymd(c('20240101','20240102',NA, NA, NA)))

想要通过dplyr的mutate语句填充列中的NA值,但你尝试的以下代码只能填充第一个NA,无法处理连续的NA:

aa %>% 
  mutate(date = if_else(!is.na(date), date, dplyr::lag(date) + lubridate::days(1)))

解决方案1:用purrr::accumulate递推填充

借助purrr包的accumulate函数逐行处理,遇到非NA值直接保留,遇到NA就基于前一个已处理的值加1天,实现连续递推:

library(lubridate)
library(dplyr)
library(purrr)

aa %>%
  mutate(date = accumulate(date, function(prev, curr) {
    if (!is.na(curr)) curr else prev + days(1)
  }))

解决方案2:分组后生成序列

先按非NA值划分分组,将每个非NA值及其后续的NA归为同一组,再在组内基于首行日期和行号生成连续日期:

library(lubridate)
library(dplyr)

aa %>%
  mutate(group = cumsum(!is.na(date))) %>%
  group_by(group) %>%
  mutate(date = first(date) + days(row_number() - 1)) %>%
  ungroup() %>%
  select(-group)

两种方法都能得到如下结果:

# A tibble: 5 × 1
  date      
  <date>    
1 2024-01-01
2 2024-01-02
3 2024-01-03
4 2024-01-04
5 2024-01-05

内容的提问来源于stack exchange,提问作者JFD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 04:00:56