如何在 R 中重复闰年二月最后一天的值?

How to repeate the value of the last day of February for a leap year in R?

我有一个 data.frame 不考虑闰年(即所有年份都是 365 天)。我想在闰年 2 月重复最后一天的值。我下面代码中的 DF 有假数据集,我 故意 删除了 DF_NoLeapday 中的闰日值。我想在 DF_NoLeapday 中添加一个闰日值,方法是重复闰年二月最后一天的值(在我们的示例中为 2004 年 2 月 28 日的值)。我宁愿有一个通用的解决方案来将其应用于多年的数据。

set.seed(55)
DF <- data.frame(date = seq(as.Date("2003-01-01"), to= as.Date("2005-12-31"), by="day"),
                 A = runif(1096, 0,10),
                 Z = runif(1096,5,15))
DF_NoLeapday <-  DF[!(format(DF$date,"%m") == "02" & format(DF$date, "%d") == "29"),  ,drop = FALSE]

我们可以在已经是 Date class 的 'date' 列上使用 complete 来扩展行以填充缺失的日期

library(dplyr)
library(tidyr)
out <- DF_NoLeapday  %>% 
           complete(date = seq(min(date), max(date), by = '1 day'))
dim(out)
#[1] 1096    3

out %>% 
    filter(date  >= '2004-02-28', date <= '2004-03-01')
# A tibble: 3 x 3
#  date           A     Z
#  <date>     <dbl> <dbl>
#1 2004-02-28  9.06  9.70
#2 2004-02-29 NA    NA   
#3 2004-03-01  5.30  7.35

默认情况下,其他列的值填充为NA,如果我们需要将其更改为不同的值,可以在complete以内完成fill

如果我们需要以前的值,那么使用fill

out <- out %>%
          fill(A, Z)
out %>% 
         filter(date  >= '2004-02-28', date <= '2004-03-01')
# A tibble: 3 x 3
#  date           A     Z
#  <date>     <dbl> <dbl>
#1 2004-02-28  9.06  9.70
#2 2004-02-29  9.06  9.70
#3 2004-03-01  5.30  7.35