2011-09-16 10 views
9

que tienen una matriz con 12 filas y 77 columnas, sino simplemente permite el uso:¿Cómo identificar qué columnas no son "NA" por fila en una matriz?

p <- matrix(NA,5,7) 
p[1,2]<-0.3 
p[1,3]<-0.5 
p[2,4]<-0.9 
p[2,7]<-0.4 
p[4,5]<-0.6 

Quiero saber qué columnas no son "NA" por fila, por lo que lo que me gustaría conseguir sería algo como:

[1] 2,3 
[2] 4 
[3] 0 
[4] 5 
[5] 0 

pero si lo hago me sale > which(p[]!="NA")[1] 6 11 17 24 32

he intentado utilizar un bucle:

aux <- matrix(NA,5,7) 
for(i in 1:5) { 
    aux[i,]<-which(p[i,]!="NA") 
} 

pero apenas consigo un error: number of items to replace is not a multiple of replacement length

¿Hay una manera de hacer esto? Gracias de antemano

Respuesta

16

Probar:

which(!is.na(p), arr.ind=TRUE) 

que creo que es tan informativa y probablemente más útil que el de salida especificado, pero si realmente quería la versión de la lista, entonces esto podría ser utilizado:

> apply(p, 1, function(x) which(!is.na(x))) 
[[1]] 
[1] 2 3 

[[2]] 
[1] 4 7 

[[3]] 
integer(0) 

[[4]] 
[1] 5 

[[5]] 
integer(0) 

o incluso con smushing entre sí con pasta:

lapply(apply(p, 1, function(x) which(!is.na(x))) , paste, collapse=", ") 

La salida de which función el método sugerido ofrece la fila y columna de la no-cero (TRUE) ubicaciones de pruebas lógicas:

> which(!is.na(p), arr.ind=TRUE) 
    row col 
[1,] 1 2 
[2,] 1 3 
[3,] 2 4 
[4,] 4 5 
[5,] 2 7 

sin el parámetro arr.ind establecido en TRUE no predeterminado, que sólo se les la "localización vector" determina utilizando la columna principal ordenando el R tiene como convención. Las matrices R son solo "vectores plegados".

> which(!is.na(p)) 
[1] 6 11 17 24 32 
+0

Y, por último, se podría agregar una verificación para length()> 0 para devolver 0 en lugar de entero (0). – joran

+0

El rendimiento de plegado, colapso produce elementos de carácter vacíos, '" "', en lugar del entero torpe (0) '. –

Cuestiones relacionadas