我目前正在处理时间序列数据,它看起来如下:
ID | Var1 | Var2 | Var3 | >Var4 | Var5
---|---|---|---|---|
1 | A | NAANA | ||
2 | B | C | NA | B |
3 | A | |||
4 | A | B | NANA | |
5 | C | NA | B | NA
- 枢轴使用
tidyr::fill()
的时间更长 - 使用
fill()
创建fill_down
和fill_up
列,这两列将分别包括上一个和下一个不丢失的值 - 如果上一个未丢失==下一个未缺失,则使用该值;否则保持值不变。(这也将保持非缺失值不变,因为在这种情况下,前一个非缺失值将始终==下一个非遗漏值。(
- 数据透视回原始格式
library(tidyverse)
df_filled <- df %>%
pivot_longer(!ID) %>%
mutate(
fill_down = value,
fill_up = value
) %>%
group_by(ID) %>%
fill(fill_down) %>%
fill(fill_up, .direction = "up") %>%
mutate(value = if_else(fill_down == fill_up, fill_down, value)) %>%
ungroup() %>%
pivot_wider(id_cols = ID)
df_filled
# # A tibble: 5 x 6
# ID Var1 Var2 Var3 Var4 Var5
# <dbl> <chr> <chr> <chr> <chr> <chr>
# 1 1 A A A A A
# 2 2 B C NA NA B
# 3 3 A A A A A
# 4 4 A B B B B
# 5 5 C NA B B B