2012-05-28 16 views
12

Si tengo un solo vector, puedo conseguir la primera ocurrencia, que está por debajo de un valor:Conseguir índice de la primera aparición de un valor en cada columna de una matriz

test <- c(0.5,0.8,0.1,0.08,0.06,0.04) 
which(test<0.1)[1]  

que da correctamente la respuesta como 4 . Sin embargo, cómo consigo la primera aparición dentro de cada columna de una matriz, tal como la ocurrencia furst por debajo de 5 en la matriz 2 la columna siguiente:

test2 <- matrix(c(5,8,3,4,7,5,6,2),ncol=2) 

Usando apply con which devuelve una lista:

> apply(test2<5,2,which) 
[[1]] 
[1] 3 4 

[[2]] 
[1] 4 

durante el uso de apply con which.min vuelve 1 para todas las columnas:

> apply(test2<5,2,which.min) 
[1] 1 1 

wh Ereas, lo que quiero debería simplemente devolver [1] 3 4 - ¿Me falta algo obvio?

Respuesta

7

Aquí hay otra respuesta. Suponiendo que te refieres a test2 donde escribes test3, ten en cuenta que 'test2 < 5' es un vector lógico. El valor mínimo será FALSO. El valor máximo (VERDADERO) es lo que quiere:

> apply(test2<5,2,which.max) 
[1] 3 4 

Tenga en cuenta que esto no es correcto si el valor máximo no es cierto.

+0

Sí, ¡esto también funciona! Obtengo el mismo resultado que usar la otra respuesta cuando la aplico a mi conjunto de resultados mucho más grande – ChrisW

5

Prueba esto:

test2 <- matrix(c(5,8,3,4,7,5,6,2),ncol=2) 
> test2 
    [,1] [,2] 
[1,] 5 7 
[2,] 8 5 
[3,] 3 6 
[4,] 4 2 
> foo <- function(x){which(x < 5)[1]} 
> apply(test2,2,foo) 

La clave aquí es que se toma la pieza que sepa que funciona en un único vector, y simplemente lo envuelve en una función. apply, bueno, aplicará esa función a cada columna.

+0

Gracias - ¡Pude haber podido resolverlo por mi cuenta realmente! Es fácil cuando ves la respuesta ... – ChrisW

4

Debido Me tropecé con esto, aquí hay otra solución:

max.col(t(test2 < 5), "first") 
0

Como se ha señalado por Matthew, which.max no devuelve el valor correcto si no hay ningún valor < 5 en una columna (que vuelve 1, mientras que el el valor correcto es "nada"). La función match es buena para manejar este caso:

> test2 <- matrix(c(5,8,3,4, 7,5,6,7), ncol=2) 
> apply(test2<5, 2, which.max) 
[1] 3 1 
> apply(test2<5, 2, function(x) match(TRUE, x)) 
[1] 3 NA 
Cuestiones relacionadas