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

如何用更简洁的tidyverse方法填充日期列缺失值(下值减一年)

问题:按规则填充日期列的缺失值

我有一个包含日期列的data.frame,其中存在部分缺失值,代码示例如下:

my_df <- data.frame(date = as.Date(c("2020-07-01", NA, NA, NA, "2022-07-01", "2023-07-01")))
my_df
#         date
# 1 2020-07-01
# 2       <NA>
# 3       <NA>
# 4       <NA>
# 5 2022-07-01 # NAs to be replaced with 2022-07-01 minus one year
# 6 2023-07-01

希望按以下规则填充NA日期:

  • 向上填充下一个非NA值
  • 将填充后的值减去1年

期望结果如下:

data.frame(date = as.Date(c("2020-07-01", "2021-07-01", "2021-07-01", "2021-07-01", "2022-07-01", "2023-07-01")))

#         date
# 1 2020-07-01
# 2 2021-07-01 
# 3 2021-07-01 
# 4 2021-07-01 
# 5 2022-07-01
# 6 2023-07-01

我倾向于使用tidyverse,尝试结合fill()和lubridate的%m-% years(1)实现,方法如下:

my_df <- my_df %>%
  mutate(date2 = date %m-% years(1)) %>%
  fill(date2, .direction = "up") %>%
  mutate(date = if_else(is.na(date), date2, date)) %>%
  select(-date2)

该方法可行,但想知道是否有更直接的实现方式?


更简洁的实现方式

可以把填充逻辑和日期计算合并到一步,无需创建临时辅助列,直接在原列上完成操作:

方法一:用if_else直接嵌套

library(tidyverse)
library(lubridate)

my_df <- my_df %>%
  mutate(
    date = if_else(
      is.na(date),
      fill(date, .direction = "up") %m-% years(1),
      date
    )
  )

方法二:用replace_na简化写法

my_df <- my_df %>%
  mutate(date = replace_na(date, fill(date, .direction = "up") %m-% years(1)))

这两种方式都省去了临时列的创建与删除步骤,逻辑更紧凑直接,同样能达到预期效果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 21:31:07