2012-02-02 4 views
2

J'ai déterminé comment identifier tous les modèles uniques d'observations manquantes dans un ensemble de données. Maintenant, je voudrais sélectionner toutes les lignes de cet ensemble de données avec un modèle donné d'observations manquantes. Je voudrais le faire de façon itérative de sorte que s'il y a n modèles d'observations manquantes dans l'ensemble de données, je me retrouve avec n ensembles de données contenant chacun seulement un modèle d'observations manquantes.en utilisant R pour sélectionner des lignes dans l'ensemble de données avec des observations manquantes correspondantes

Je sais comment faire, mais ma méthode n'est pas très efficace et n'est pas générale. J'espère apprendre une approche plus efficace et plus générale parce que mes ensembles de données réelles sont beaucoup plus grandes et plus variables que dans l'exemple ci-dessous.

Voici un exemple de jeu de données et le code que j'utilise. Je ne prends pas la peine d'inclure le code que j'ai utilisé pour créer la matrice zzz à partir de la matrice dd, mais je peux ajouter ce code si cela peut aider.

dd <- matrix(c( 
      1, 0, 1, 1, 
      NA, 1, 1, 0, 
      NA, 0, 0, 0, 
      NA, 1,NA, 1, 
      NA, 1, 1, 1, 
      0, 0, 1, 0, 
      NA, 0, 0, 0, 
      0,NA,NA,NA, 
      1,NA,NA,NA, 
      1, 1, 1, 1, 
      NA, 1, 1, 0), 
nrow=11, byrow=T) 

zzz <- matrix(c(
      1, 1, 1, 1, 
      NA, 1, 1, 1, 
      NA, 1,NA, 1, 
      1,NA,NA,NA 
), nrow=4, byrow=T) 

for(jj in 1:dim(zzz)[1]) { 
ddd <- 
dd[ 
((dd[, 1]%in%c(0,1) & zzz[jj, 1]%in%c(0,1)) | 
    (is.na(dd[, 1]) & is.na(zzz[jj, 1]))) & 
((dd[, 2]%in%c(0,1) & zzz[jj, 2]%in%c(0,1)) | 
(is.na(dd[, 2]) & is.na(zzz[jj, 2]))) & 
((dd[, 3]%in%c(0,1) & zzz[jj, 3]%in%c(0,1)) | 
(is.na(dd[, 3]) & is.na(zzz[jj, 3]))) & 
((dd[, 4]%in%c(0,1) & zzz[jj, 4]%in%c(0,1)) | 
(is.na(dd[, 4]) & is.na(zzz[jj, 4]))),] 

print(ddd) 
} 

Les 4 ensembles de données résultant dans cet exemple sont:

a) 
1 0 1 1 
0 0 1 0 
1 1 1 1 

b) 
NA 1 1 0 
NA 0 0 0 
NA 1 1 1 
NA 0 0 0 
NA 1 1 0 

c) 
NA 1 NA 1 

d) 
0 NA NA NA 
1 NA NA NA 

Y at-il une méthode plus générale et plus efficace de faire la même chose? Dans l'exemple ci-dessus, les 4 jeux de données résultants ne sont pas sauvegardés, mais je les sauvegarde avec mes données réelles.

Nous vous remercions de vos conseils.

Mark Miller

Répondre

3
# Missing value patterns (TRUE=missing, FALSE=present) 
patterns <- unique(is.na(dd)) 

result <- list() 
for(i in seq_len(nrow(patterns))) { 
    # Rows with this pattern 
    rows <- apply(dd, 1, function(u) all(is.na(u) == patterns[i,])) 
    result <- append(result, list(dd[rows,])) 
} 
1

Pas tout à fait sûr que je comprends la question, mais voici un coup de poignard à elle ...

La première chose que vous voulez faire est de comprendre quels sont les éléments NA, et qui ne sont pas. Pour cela, vous pouvez utiliser la fonction is.na().

is.na(dd) 

va générer une matrice de la même taille que dd contenant TRUE si la valeur est NA, et FALSE ailleurs.

Vous voulez ensuite trouver les motifs uniques dans votre matrice. Pour cela, vous voulez la fonction unique(), qui accepte un paramètre 'marge', vous permettant de ne trouver que des lignes uniques dans une matrice.

zzz <- unique(is.na(dd), margin=1) 

crée une matrice similaire à votre matrice zzz, mais vous pouvez, bien sûr, remplacer le « vrai » s pour et NAs « FAUX » s pour 1 de sorte qu'il serait identique à votre matrice.

Vous pouvez ensuite parcourir quelques directions à partir d'ici pour essayer de les trier en différents ensembles de données. Malheureusement, je pense que vous allez avoir besoin d'une boucle ici. À ce stade, vous avez une liste qui contient toutes les lignes de dd, triées par modèle de NA. Vous constaterez que le motif exprimé dans la ligne 1 de zzz correspondra à la ligne 1 des résultats, et la même chose pour le reste des lignes.

+0

Merci à vous deux. Les deux réponses donnent le résultat que j'espérais et sont très utiles. Mark Miller –

Questions connexes