Pregunta ¿Cómo identificar qué columnas no son "NA" por fila en una matriz?


Tengo una matriz con 12 filas y 77 columnas, pero simplemente la dejo usar:

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, entonces lo que me gustaría obtener sería algo como:

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

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

Intenté usar un bucle:

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

pero acabo de recibir un error: number of items to replace is not a multiple of replacement length

¿Hay alguna forma de hacer esto? Gracias por adelantado


9
2017-09-16 18:06


origen


Respuestas:


Tratar:

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

Lo cual creo que es tan informativo y probablemente más útil que el resultado que especificó, pero si realmente deseaba la versión de la lista, podría usarla:

> 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 junto con pegar:

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

El resultado de which función El método sugerido entrega la fila y columna de ubicaciones distintas de cero (TRUE) de las 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 arr.ind el parámetro configurado como no predeterminado es VERDADERO, usted solo obtiene la "ubicación del vector" determinada usando la columna principal que ordena el R como su convención. Las matrices R son solo "vectores plegados".

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

18
2017-09-16 18:10