2012-05-28 18 views
12

Wenn ich einen einzelnen Vektor haben, kann ich das erste Vorkommen erhalten, die unter einem Wert ist:Erste Index des ersten Auftretens eines Wertes in jeder Spalte einer Matrix

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

die korrekte Antwort als 4 gibt . Aber wie kann ich in jeder Spalte einer Matrix, wie das furst Auftreten unter 5 in der folgenden 2 Säulenmatrix das erste Vorkommen erhalten:

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

Mit apply mit which gibt eine Liste:

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

[[2]] 
[1] 4 
mit apply mit which.min kehrt 1 für alle Spalten

während:

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

wh Ereas, was ich will, sollte einfach [1] 3 4 zurückgeben - vermisse ich etwas offensichtlich?

Antwort

7

Hier ist eine andere Antwort. Angenommen, Sie meinen test2, wo Sie test3 schreiben, beachten Sie, dass "test2 < 5" ein logischer Vektor ist. Der Mindestwert ist FALSE. Der Maximalwert (TRUE) ist, was Sie wollen:

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

Beachten Sie, dass dies nicht richtig ist, wenn der Maximalwert ist nicht wahr.

+0

Ja - das funktioniert auch! Ich erhalte das gleiche Ergebnis wie die andere Antwort, wenn ich sie auf meine viel größere Ergebnismenge anwende – ChrisW

5

Versuchen Sie folgendes:

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) 

Der Schlüssel hier ist, dass Sie das Stück nehmen, dass Sie Arbeiten auf einem einzigen Vektor kennen, und sie einfach in einer Funktion wickeln. apply wird nun diese Funktion auf jede Spalte anwenden.

+0

Danke - ich hätte es geschafft, das von mir wirklich wirklich zu arbeiten! Es ist einfach, wenn Sie die Antwort sehen ... – ChrisW

4

Weil ich auf diese nur gestolpert, hier ist eine andere Lösung:

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

Wie Matthew erwähnt, hat which.max nicht den richtigen Wert zurück, wenn es in einer Spalte kein Wert < 5 ist (es gibt 1, während die korrekter Wert ist "nichts"). Die match Funktion ist nett, diesen Fall zu behandeln:

> 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 
Verwandte Themen