2010-02-15 13 views
8

Tengo un marco de datos de 114 filas por 16 columnas donde las filas son individuales, y las columnas son sus nombres o NA. Por ejemplo, las 3 primeras filas se ve así:Manejando los valores de NA en aplicar y único

  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> 

Quiero generar una lista (si hay varios nombres únicos por fila) o vector (si sólo hay un nombre único por fila) de todos los nombres únicos, con longitud 114.

Cuando intento apply(x,1,unique) obtengo una matriz 2xNcol donde a veces la primera fila de la celda es NA y, a veces, la segunda fila de la celda es 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" 

Cuando lo que me gustaría es simplemente:

Aanestad 
Ackerman 
Alarcon 
... 

Me parece que no puede encontrar la manera de aplicar único() sin tener en cuenta NA. na.rm, na.omit, etc. no parecen funcionar. Siento que me falta algo muy simple ...

Gracias!

Respuesta

18

unique no parecen tener un argumento na.rm, pero se puede quitar los valores que faltan a sí mismo antes de llamar a:

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)])) 

da

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

Ahh ... esto funciona! ¡Gracias! – bshor

8

Usted era muy, muy cerca de su inicial solución. Pero como Aniko comentó, no debes eliminar los valores de NA antes de poder usarlos de manera única.

Un ejemplo en el que primero creamos un data.frame similares y luego usamos apply() como lo hizo - pero con una función anónima adicional que se utiliza para combinar na.omit() y 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

Esto funciona genial, también. Gracias, Dirk (¡ve a los usuarios de Chicago R!) – bshor

Cuestiones relacionadas