我有这样的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)
)
答案 0 :(得分: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