2012-05-28 12 views
12

Se ho un singolo vettore, posso ottenere il primo evento che è inferiore ad un valore:Come indice della prima occorrenza di un valore in ogni colonna della matrice

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

che dà correttamente la risposta come 4 . Tuttavia, come ottengo la prima occorrenza all'interno di ciascuna colonna della matrice, come il verificarsi furst sotto 5 nella seguente matrice 2 colonna:

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

Uso apply con which restituisce una lista:

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

[[2]] 
[1] 4 

durante l'utilizzo apply con which.min rendimenti 1 per tutte le colonne:

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

wh Eeeek, quello che voglio dovrebbe solo restituire [1] 3 4 - mi manca qualcosa di ovvio?

risposta

7

Ecco un'altra risposta. Supponendo che tu intenda test2 dove scrivi test3, nota che 'test2 < 5' è un vettore logico. Il valore minimo sarà FALSE. Il valore massimo (VERO) è ciò che si vuole:

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

Nota che questo non è corretto se il valore massimo non è vero.

+0

Sì, anche questo funziona! Ottengo lo stesso risultato dell'usare l'altra risposta quando la applico al mio set di risultati molto più ampio – ChrisW

5

Prova questa:

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 chiave qui è che si prende il pezzo che si sa opere su un singolo vettore, e semplicemente avvolgere in una funzione. apply applicherà questa funzione a ciascuna colonna.

+0

Grazie - avrei dovuto essere in grado di lavorare che da me davvero! È facile quando vedi la risposta ... – ChrisW

4

Perché ho appena imbattuto in questo, ecco un'altra soluzione:

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

Come notato da Matthew, which.max non restituisce il valore corretto se non c'è nessun valore < 5 in una colonna (restituisce 1, mentre il il valore corretto è "nulla"). La funzione match è bello per gestire questo 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 
Problemi correlati