R - der Schnellste Weg zum auswählen der Zeilen einer matrix, die mehrere Bedingungen erfüllen
Dies ist eine Erweiterung der Frage auf die Rückgabe der Zeilen einer matrix, die eine Bedingung erfüllt in R. Sagen, ich habe die matrix:
one two three four
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 11 18
[4,] 4 9 11 19
[5,] 5 10 15 20
[6,] 1 6 15 20
[7,] 5 7 12 20
Möchte ich alle Zeilen, wo matrix$two == 7
UND matrix$three == 12
so schnell wie möglich. Dies ist der Weg, den ich kenne, es zu tun:
out <- mat[mat$two == 7,]
final_out <- out[out$three == 12, ]
Es sollte natürlich eine Methode sein, um den Inhalt der final_out
in einem Einzeiler, sowas wie: final_out <- which(mat$two == 7 && mat$three == 12)
das ist schneller und kürzer als die zwei Linie des codes oben.
Was ist der Schnellste R-code dafür mehrere matrix-Bedingung Abfragen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie einfach
[
Untergruppen mit logischen Vergleich...UPDATE MIT MICROBENCHMARK:
Mithilfe von benchmark gibt die entgegengesetzte Antwort. Es scheint, die Antwort von @SimonO101 bietet eine etwas schnellere Umsetzung.
ALTE ANTWORT:
Kombination der Antworten von @Jiber und @SimonO101 bietet eine etwas schnellere Antwort, zumindest auf meinem computer.
Machte ich die matrix sehr viel größer zu trennen, die berechnungszeiten.
Dies ist offensichtlich davon ausgegangen, die matrix-Spalten benannt sind.
library(microbenchmark)
für die Berechnung der Zeiten...es ist viel zuverlässiger.Verwenden
which
mitarr.ind=TRUE
wie in:mat[mat[,"two"] == 7 & mat[,"three"] == 12,]
which
Wenn Sie eine Menge von Zeilen, es wäre noch besser, Teilmenge Erstens, wie Sie sehen können, in der folgende code
Die nachstehenden Ergebnisse:
die absolute Schnellste Weg, in R wird
ifelse
die im Gegensatz zuif
ermöglicht vektorisierte Bedingungen. Sie können auch cache-Vektoren von Bedingungen (z.B.isSeven <- mat[, 'two'] == 7
) und Nutzung/Wiederverwendung später.Habe ich nicht ein reproduzierbares Beispiel hier, aber ich möchte etwas tun, wie
Können Sie plop anderen Bedingungen in es oder haben es etwas zurückkehren, das führt zu einem harmonischen Vektor.
ifelse
wird schneller sein als logischen Untergruppen. Afterall, das ist genau das, wasifelse
hat intern.