R:替换预定日期的NA

问题描述 投票:2回答:1

我有这样的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>

所有的周三都是新的。有几个不同的代码,每个代码可以有不同的序列(即:工人1001可以在2017年2月1日开始,工人1005可以在2017年5月3日开始。

我想将这个NAs替换为逻辑日期。

我想知道,在下一个寄存器具有相同代码的情况下,解决方案可以在减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)
)
r date conditional na
1个回答
3
投票

您可以通过上下移动观察序列并从中推断出日期来估算缺失值

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
© www.soinside.com 2019 - 2024. All rights reserved.