R: Заменить NA для следующей даты

У меня есть df, как это:

       Codigo  time       date
1       1001  8.77 2017-01-02
2       1001  8.96 2017-01-03
3       1001  9.56       <NA>
4       1001  7.81 2017-01-05
5       1001  0.00 2017-01-06
6       1001  9.58 2017-01-09
7       1001  9.64 2017-01-10
8       1001 12.11       <NA>
9       1005  6.86       <NA> 
10      1005  6.81 2017-05-04
11      1005  6.83 2017-05-05 
12      1005  6.86 2017-05-08
13      1005  6.90 2017-05-09
14      1005  6.42       <NA>

Все среды являются NA. Существует несколько разных кодов, и каждый код может иметь разные последовательности (т. Е. Работник 1001 мог начаться в день 02/01/2017, а работник 1005 мог начаться в день 03/05/2017.

Я хотел бы заменить эти NA на логическую дату.

Мне было интересно, что решение может назначить дату до минус 1, в случае, если следующий регистр имеет тот же код, в противном случае он может назначить регистр до даты плюс 1. Нет ни одного кода с одним регистром.

Заранее спасибо.

Данные

df <- data.frame(
      Codigo = c(1001L, 1001L, 1001L, 1001L, 1001L, 1001L, 1001L, 1001L, 1005L,
                 1005L, 1005L, 1005L, 1005L, 1005L),
        time = c(8.77, 8.96, 9.56, 7.81, 0, 9.58, 9.64, 12.11, 6.86, 6.81,
                 6.83, 6.86, 6.9, 6.42),
        date = c("2017-01-02", "2017-01-03", NA, "2017-01-05", "2017-01-06",
                 "2017-01-09", "2017-01-10", NA, NA, "2017-05-04",
                 "2017-05-05", "2017-05-08", "2017-05-09", NA)
)

1 ответ

Решение

Вы можете вменять пропущенные значения, сдвигая последовательность своих наблюдений вверх и вниз и выводя даты из них

df %>% 
  group_by(Codigo) %>% 
  mutate(yesterday=lag(date),
         tomorrow=lead(date),
         date=case_when(
           is.na(date) & is.na(tomorrow) ~ yesterday + lubridate::days(1),
           is.na(date)                   ~ tomorrow - lubridate::days(1),
           TRUE ~ date)) %>%
  select(-yesterday, -tomorrow)

#> # A tibble: 14 x 3
#> # Groups:   Codigo [2]
#>    Codigo  time       date
#>     <int> <dbl>     <date>
#>  1   1001  8.77 2017-01-02
#>  2   1001  8.96 2017-01-03
#>  3   1001  9.56 2017-01-04
#>  4   1001  7.81 2017-01-05
#>  5   1001  0.00 2017-01-06
#>  6   1001  9.58 2017-01-09
#>  7   1001  9.64 2017-01-10
#>  8   1001 12.11 2017-01-11
#>  9   1005  6.86 2017-05-03
#> 10   1005  6.81 2017-05-04
#> 11   1005  6.83 2017-05-05
#> 12   1005  6.86 2017-05-08
#> 13   1005  6.90 2017-05-09
#> 14   1005  6.42 2017-05-10
Другие вопросы по тегам