Этот ответ очень зависит от того, что ваши фактические данные похожи по структуре на данные вашего примера.
Ваши данные:
df1 <- structure(list(id = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L),
colA = c(NA, "Y", "Z", "Z", "Z", "Z", NA, NA),
colB = c("X", "X", NA, "Y", "Y", "Y", NA, NA)),
class = "data.frame",
row.names = c(NA, -8L))
Предполагая, как в вашем примере, что каждый id
встречается дважды и что, когда одно наблюдение равно NA
, это первое наблюдение для этого id
, тогда это работает:
library(dplyr)
library(tidyr)
df1 %>%
group_by(id) %>%
fill(colA, colB, .direction = "up") %>%
ungroup() %>%
distinct()
# A tibble: 4 x 3
id colA colB
<int> <chr> <chr>
1 1 Y X
2 2 Z Y
3 3 Z Y
4 4 NA NA
Если второе наблюдение для id
может быть NA
, вы можете попробовать добавить секунду fill
после первого, но на этот раз заполните:
df1 %>%
group_by(id) %>%
fill(colA, colB, .direction = "up") %>%
fill(colA, colB, .direction = "down") %>%
ungroup() %>%
distinct()