Как повторить значение последнего дня февраля для високосного года в R? - PullRequest
1 голос
/ 21 апреля 2020

У меня есть data.frame, который не учитывает високосный год (ie все годы - 365 дней). Я хотел бы повторить значение последнего дня февраля в високосный год. DF в моем коде ниже содержит ложные данные, я намеренно удаляю значение високосного дня в DF_NoLeapday. Я хотел бы добавить значение високосного дня в DF_NoLeapday, повторяя значение последнего дня февраля в високосном году (в нашем примере это будет значение 28 февраля 2004 г.). Я бы хотел иметь общее решение, чтобы применить это к многолетним данным.

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]

1 Ответ

1 голос
/ 21 апреля 2020

Мы можем использовать complete в столбце 'date', который уже является классом Date, чтобы расширить строки, чтобы заполнить пропущенные даты

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
...