如何用更简洁的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
相关产品推荐
相关产品推荐

