2010-02-15 9 views
8

J'ai une ligne de données 114 lignes par 16 colonnes où les lignes sont des individus, et les colonnes sont leur nom ou NA. Par exemple, les 3 premières lignes ressemble à ceci:Gestion des valeurs NA dans apply et unique

  name name.1  name.2 name.3  name.4 name.5  name.6 name.7  name.8 name.9  name.10 name.11  name.12 name.13  name.14 name.15 
1   <NA> <NA>  <NA> <NA>   <NA> <NA>   <NA> <NA>   <NA> <NA>  Aanestad <NA>  Aanestad <NA>  Aanestad <NA> 
2   <NA> <NA>  <NA> <NA>   <NA> <NA>   <NA> <NA>  Ackerman <NA>  Ackerman <NA>  Ackerman <NA>  Ackerman <NA> 
3   <NA> <NA>  <NA> <NA>   <NA> <NA>  Alarcon <NA>  Alarcon <NA>  Alarcon <NA>  Alarcon <NA>   <NA> <NA> 

Je veux générer une liste (si plusieurs noms uniques par ligne) ou le vecteur (si un seul nom unique par ligne) de tous les noms uniques, avec longueur 114.

Lorsque j'essaie apply(x,1,unique) j'obtiens un tableau 2xNcol où parfois la cellule de la première rangée est NA et parfois la cellule de la deuxième rangée est NA.

[,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7] [,8] [,9]  
[1,] NA   NA   NA  NA  "Alquist" NA  "Ayala" NA  NA  
[2,] "Aanestad" "Ackerman" "Alarcon" "Alpert" NA  "Ashburn" NA  "Baca" "Battin" 

Quand ce que je voudrais est juste:

Aanestad 
Ackerman 
Alarcon 
... 

Je ne peux pas sembler comprendre comment appliquer uniques() tout en ignorant NA. na.rm, na.omit etc. ne semblent pas fonctionner. J'ai l'impression qu'il me manque quelque chose de très simple ...

Merci!

Répondre

18

unique ne semble pas avoir un argument na.rm, mais vous pouvez supprimer les vous-même des valeurs manquantes avant de l'appeler:

A <- matrix(c(NA,"A","A", 
      "B", NA, NA, 
       NA, NA, "C"), nr=3, byrow=TRUE) 
apply(A, 1, function(x)unique(x[!is.na(x)])) 

donne

[1] "A" "B" "C" 
+0

Ahh ... cela fonctionne! Merci! – bshor

8

Vous étiez très, très proche de votre initiale Solution. Mais comme Aniko a remarqué, vous ne devez pas supprimer les valeurs NA avant de pouvoir utiliser unique.

Un exemple où nous avons d'abord créer un semblable data.frame puis utilisez apply() comme vous l'avez fait - mais avec une fonction anonyme supplémentaire qui est utilisé pour combiner na.omit() et unique():

R> DF <- t(data.frame(foo=sample(c(NA, "Foo"), 5, TRUE), 
         bar=sample(c(NA, "Bar"), 5, TRUE))) 
R> DF 
    [,1] [,2] [,3] [,4] [,5] 
foo "Foo" NA "Foo" "Foo" "Foo" 
bar NA NA NA "Bar" "Bar" 
R> apply(DF, 1, function(x) unique(na.omit(x))) 
    foo bar 
"Foo" "Bar" 
+0

Cela fonctionne très bien aussi. Merci, Dirk (allez les utilisateurs de Chicago R!) – bshor

Questions connexes