Manipulación NA valores en aplicar y único
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!
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"