7 votes

Attribution de valeurs catégoriques aux NA de façon aléatoire ou proportionnelle

J'ai un ensemble de données :

df <- structure(list(gender = c("female", "male", NA, NA, "male", "male", 
"male"), Division = c("South Atlantic", "East North Central", 
"Pacific", "East North Central", "South Atlantic", "South Atlantic", 
"Pacific"), Median = c(57036.6262, 39917, 94060.208, 89822.1538, 
107683.9118, 56149.3217, 46237.265), first_name = c("Marilyn", 
"Jeffery", "Yashvir", "Deyou", "John", "Jose", "Daniel")), row.names = c(NA, 
-7L), class = c("tbl_df", "tbl", "data.frame"))

J'ai besoin d'effectuer une analyse telle que je ne peux pas avoir NA dans les gender variable. Les autres colonnes sont trop peu nombreuses et n'ont pas de valeur prédictive connue, de sorte que l'imputation des valeurs n'est pas vraiment possible.

Je peux effectuer l'analyse en supprimant entièrement les observations incomplètes - elles représentent environ 4 % de l'ensemble de données, mais j'aimerais voir les résultats en assignant de manière aléatoire les observations incomplètes à l'ensemble de données. female o male dans les affaires manquantes.

À part écrire un code assez laid pour filtrer les cas incomplets, les diviser en deux et les remplacer par des cas plus complexes, il n'y a pas d'autre solution. NA s avec female o male dans chaque moitié, je me suis demandé s'il n'y avait pas un moyen élégant d'attribuer des valeurs de manière aléatoire ou proportionnelle dans les NA s ?

4voto

www Points 27760

Nous pouvons utiliser ifelse y is.na pour déterminer si na existent, et ensuite utiliser sample pour sélectionner au hasard female y male .

df$gender <- ifelse(is.na(df$gender), sample(c("female", "male"), 1), df$gender)

4voto

Que dites-vous de ça ?

> df <- structure(list(gender = c("female", "male", NA, NA, "male", "male", 
+                                 "male"),
+                      Division = c("South Atlantic", "East North Central", 
+                                   "Pacific", "East North Central", "South Atlantic", "South Atlantic", 
+                                   "Pacific"),
+                      Median = c(57036.6262, 39917, 94060.208, 89822.1538,
+                                 107683.9118, 56149.3217, 46237.265),
+                      first_name = c("Marilyn", "Jeffery", "Yashvir", "Deyou", "John", "Jose", "Daniel")),
+                 row.names = c(NA, -7L), class = c("tbl_df", "tbl", "data.frame"))
> 
> Gender <- rbinom(length(df$gender), 1, 0.52)
> Gender <- factor(Gender, labels = c("female", "male"))
> 
> df$gender[is.na(df$gender)] <- as.character(Gender[is.na(df$gender)])
> 
> df$gender
[1] "female" "male"   "female" "female" "male"   "male"   "male"  
> 

Thats est aléatoire avec une probabilité donnée. Vous pouvez également envisager d'imputer des valeurs en utilisant les voisins les plus proches, le hot desk ou d'autres méthodes similaires.

J'espère que cela vous aidera.

3voto

W-B Points 94428

Il suffit d'assigner

df$gender[is.na(df$gender)]=sample(c("female", "male"), dim(df)[1], replace = TRUE)[is.na(df$gender)]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X