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!
3 Réponses :
Peut-être que vous pouvez essayer un remplissage conditionnel en fonction de la valeur distincte dans chaque groupe 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))
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()
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.
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))
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>