In R habe ich ein Element x
und einen Vektor v
. Ich möchte den ersten Index eines Elements finden, der v
gleich ist x
. Ich weiß, dass ein Weg, dies zu tun, ist : which(x == v)[[1]]
, aber das scheint übermäßig ineffizient. Gibt es einen direkteren Weg, dies zu tun?
Gibt es für Bonuspunkte eine Funktion, die funktioniert, wenn x
es sich um einen Vektor handelt? Das heißt, es sollte einen Vektor von Indizes zurückgeben, der die Position jedes Elements von x
in angibt v
.
r
indexing
match
vectorization
Ryan C. Thompson
quelle
quelle
which(x == v)[[1]]
ist es nicht so sehr ineffizient. Es ist ein Vergleich (==
) -Operator, der auf alle Vektorelemente angewendet wird, und eine Teilmenge auf den Indizes (which
). Das ist es. Nichts, was relevant sein sollte, solange Sie nicht 10.000 Wiederholungen für diese Funktion ausführen. Andere Lösungen mögenmatch
und gebenPosition
möglicherweise nicht so viele Daten zurück wiewhich
, aber sie sind nicht unbedingt effizienter.which(x == v)[[1]]
nicht ist.Antworten:
Die Funktion
match
arbeitet mit Vektoren:match
Gibt nur die erste Begegnung eines Spiels zurück, wie Sie es angefordert haben. Es gibt die Position im zweiten Argument der Werte im ersten Argument zurück.Für mehrere Übereinstimmungen
%in%
ist der richtige Weg:%in%
Gibt einen logischen Vektor zurück, solange das erste Argument vorhanden ist, mit einemTRUE
if, wenn dieser Wert im zweiten Argument gefunden werden kann, und einemFALSE
anderen.quelle
match
Angelegenheiten, wenn Sie den Index des ersten Auftretens wollen. In Ihrem Beispielmatch(x,c(4,8))
ergeben sich unterschiedliche Ergebnisse, was zunächst nicht besonders offensichtlich ist.match
. Dort wird alles erklärt. Aber ich habe diese Information hinzugefügt.Die Funktion
Position
in funprog {base} erledigt ebenfalls die Aufgabe. Sie können eine beliebige Funktion übergeben und die erste oder letzte Übereinstimmung zurückgeben.Position(f, x, right = FALSE, nomatch = NA_integer)
quelle
Ein kleiner Hinweis zur Effizienz der oben genannten Methoden:
Das Beste ist also
quelle
which("Feb" == month.abb)
kehrt zurück -2
warum die[[1]]
?which(x == v)[[1]]
, . , Aber das scheint übermäßig ineffizient“R hat den Doppelgleichheitsoperator
==
mit einer Methode zum Ermitteln des Nadelindex in einem Vektorheuhaufen überladen . Es ergibt einenlogical
Vektor, derTRUE
Werte für jede Übereinstimmung im Heuhaufen enthält.Beispiel:
Es funktioniert, wenn beide Vektoren sind, und kann erweitert werden, um auch mehrere Vektoren zu verwenden.
quelle
==
Bediener wurde in meiner Frage bereits als ineffiziente Lösung erwähnt, die mit einem Nadelvektor nicht funktioniert.FALSE FALSE TRUE FALSE TRUE
anstelle von Indizes in diesem Beispiel==
Gibt einen logischen Vektor zurück, keine Indizes. Dafür brauchst duwhich()
, wie ich vor 7 Jahren erklärt habe.