Pregunta

Tengo una trama de datos 114 fila por 16 columna en la que las filas son individuos, y las columnas son o bien sus nombres o NA. Por ejemplo, las 3 primeras filas se ve así:

            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 una longitud de 114.

Cuando intento apply(x,1,unique) consigo un array 2xNcol donde a veces la primera celda de fila es NA y en ocasiones la segunda celda de fila 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, no parecen trabajar na.omit etc. Siento que estoy perdiendo algo realmente simple ...

Gracias!

¿Fue útil?

Solución

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"

Otros consejos

Usted era muy, muy cerca de su solución inicial. Pero, como comentó Aniko, usted tiene que quitar los valores NA antes de poder utilizar único.

Un ejemplo en el que primero creamos un data.frame similar y luego usar 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" 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top