2017-10-05 4 views
0

J'ai un cadre de données incomplet, et je veux remplir les valeurs manquantes pour correspondre au groupe.Remplir les valeurs catégorielles manquantes en utilisant 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> 

Avec des valeurs numériques que je peux utiliser quelque chose comme ceci:

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

Comment puis-je remplir des valeurs catégorielles d'une manière similaire, en utilisant dplyr? Ceci est le résultat que je veux:

# # 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> 
+0

Quelle est la logique de remplissage? Pourquoi le 'NA' à la rangée 7 n'est pas rempli? – Psidom

+0

Je voudrais remplir les cellules lorsque toutes les valeurs dans le groupe sont les mêmes. Groupe 3 a à la fois "c" et "d", donc je ne peux pas connaître la bonne valeur –

Répondre

1

Vous pouvez coalesce la colonne valeur avec la valeur unique si toutes les valeurs sont les mêmes (n_distinct == 1) autrement NA, qui laissera la colonne comme il est:

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> 
+0

Merci! Je n'étais pas au courant de la fonction de coalescence. C'est exactement ce que je voulais –

+0

Cool. Content que ça aide! – Psidom