0
votes

Imputation des chaînes manquantes dans R

J'ai un grand ensemble de données avec 20% de chaînes manquantes.

NAME      |  AREA
--------------------------
Andy      |  Sales
Andy      |  Sales
Andy      |  Sales
Andy      |  Sales
Andy      |  Sales
Andy      |  Sales
Sandy     |  Construction
Sandy     |  Construction
Sandy     |  Construction
Sandy     |  Construction
Sandy     |  Construction
Wendy     |  Planting
Wendy     |  Driving
Wendy     |  NA
Wendy     |  NA
Wendy     |  NA

Dans la plupart des cas de mes données, il est presque évident qu'Andy fait des ventes et que Sandy est en construction. Mais nous ne pouvons pas être sûrs de Wendy.

Mon résultat souhaitable est:

NAME      |  AREA
--------------------------
Andy      |  Sales
Andy      |  NA
Andy      |  Sales
Andy      |  Sales
Andy      |  NA
Andy      |  Sales
Sandy     |  Construction
Sandy     |  Construction
Sandy     |  NA
Sandy     |  Construction
Sandy     |  Construction
Wendy     |  Planting
Wendy     |  Driving
Wendy     |  NA
Wendy     |  NA
Wendy     |  NA

Quel est le meilleur package d'imputation pour le gérer? Ou peut-être avez-vous une meilleure solution?

Merci d'avance!

r

0 commentaires

3 Réponses :


2
votes

Peut-être que vous pouvez essayer un remplissage conditionnel en fonction de la valeur distincte dans chaque groupe xxx pré>

data ​​strong> p>

df <- structure(list(NAME = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L), .Label = c("Andy", "Sandy", 
"Wendy"), class = "factor"), AREA = structure(c(4L, NA, 4L, 4L, 
NA, 4L, 1L, 1L, NA, 1L, 1L, 3L, 2L, NA, NA, NA), .Label = 
c("Construction", "Driving", "Planting", "Sales"), 
class = "factor")), class = "data.frame", row.names = c(NA, -16L))    


0 commentaires

3
votes

Vous pouvez utiliser le paquet souris code>. C'est très personnalisable, mais une implémentation simple serait la suivante:

library(mice)
dt <- mutate(dt, AREA = as.factor(AREA)) #make sure that area is a categorical variable

imputed_dt <- mice(dt) %>% complete()


1 commentaires

Merci pour la réponse, je lutte avec MICE pendant quelques jours, mais sans succès. Votre code a donné un résultat étrange en signant Construction à Andy, etc. Je pense que je dois étudier la documentation et ajouter quelques lignes supplémentaires.



0
votes

Voici une option avec data.table

df <- structure(list(NAME = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L), .Label = c("Andy", "Sandy", 
"Wendy"), class = "factor"), AREA = structure(c(4L, NA, 4L, 4L, 
NA, 4L, 1L, 1L, NA, 1L, 1L, 3L, 2L, NA, NA, NA), .Label = 
c("Construction", "Driving", "Planting", "Sales"), 
class = "factor")), class = "data.frame", row.names = c(NA, -16L))    

data

library(data.table)
setDT(df)[,  AREA := if(uniqueN(AREA, na.rm = TRUE) == 1) 
              first(AREA[!is.na(AREA)]) else AREA, NAME]
df
#     NAME         AREA
# 1:  Andy        Sales
# 2:  Andy        Sales
# 3:  Andy        Sales
# 4:  Andy        Sales
# 5:  Andy        Sales
# 6:  Andy        Sales
# 7: Sandy Construction
# 8: Sandy Construction
# 9: Sandy Construction
#10: Sandy Construction
#11: Sandy Construction
#12: Wendy     Planting
#13: Wendy      Driving
#14: Wendy         <NA>
#15: Wendy         <NA>
#16: Wendy         <NA>


0 commentaires