使用 dplyr group_by 填充缺失的分类值

fill missing categorial values using dplyr group_by

我有一个不完整的数据框,我想填充缺失值以匹配组。

incomplete_table <- 
    tibble(id = c(1,1,2,2,3,3,3),
       value = c("a",NA,"b","b","c","d", NA))

# # A tibble: 7 x 2
#      id value
#   <dbl> <chr>
# 1     1     a
# 2     1  <NA>
# 3     2     b
# 4     2     b
# 5     3     c
# 6     3     d
# 7     3  <NA>

对于数值,我可以这样使用:

complete_table <- incomplete_table %>% 
    group_by(id) %>% 
    mutate(value = max(value))

如何使用 dplyr 以类似的方式填充分类值? 这是我想要的结果:

# # A tibble: 7 x 2
#      id value
#   <dbl> <chr>
# 1     1     a
# 2     1     a
# 3     2     b
# 4     2     b
# 5     3     c
# 6     3     d
# 7     3  <NA>

如果所有值都相同 (n_distinct == 1),您可以 coalesce 具有唯一值的 列,否则 NA,这将使列保持原样:

incomplete_table %>% 
    group_by(id) %>% 
    mutate(value = coalesce(value, if (n_distinct(na.omit(value)) == 1) na.omit(value)[1] else NA_character_))

# A tibble: 7 x 2
# Groups:   id [3]
#     id value
#  <dbl> <chr>
#1     1     a
#2     1     a
#3     2     b
#4     2     b
#5     3     c
#6     3     d
#7     3  <NA>