Testen Sie, ob ein Vektor ein bestimmtes Element enthält


518

Wie überprüfe ich, ob ein Vektor einen bestimmten Wert enthält?


38
manchmal frage ich mich, warum R das Wort enthält einfach nicht verwendet, um es den Benutzern zu erleichtern
greg121

12
bedenken Sie, dass "in" in "conta (in) s" enthalten ist; Ich würde behaupten, dass "in" in diesem Zusammenhang ein sehr prägnanter Anwärter ist
Hedgedandlevered

1
Vielleicht mit der Hinzufügung von flankierenden %Zeichen. Das Wort inist ein reserviertes Wort in R, das in der For-Loop-Konstruktion verwendet wird.
IRTFM

@ greg121 dplyr hat bereits eine enthält- Funktion, die jedoch für einen anderen Zweck verwendet wird: zum Auswählen einer Spalte in einem Datenrahmen. Zum Beispiel select(iris, contains("etal")).
Paul Rougieux

Gibt es eine präzise Möglichkeit, dies für reelle Zahlen mit einer bestimmten Genauigkeit zu tun?
Mlt

Antworten:


500

Hierfür sind sowohl die Funktionen match()(gibt das erste Erscheinungsbild zurück) als auch %in%(gibt einen Booleschen Wert zurück) ausgelegt.

v <- c('a','b','c','e')

'b' %in% v
## returns TRUE

match('b',v)
## returns the first location of 'b', in this case: 2

Was ist mit allen Auftritten, nicht nur dem ersten?
StatsSorceress

Vielleicht komme ich etwas spät. which(v, 'b'). Beachten Sie die Reihenfolge der Argumente.
Niklas Mertsch

Sie which(v, 'b')geben mir eine Fehlermeldung:> Fehler in dem (v, 'b'): Argument zu 'welches' nicht logisch ist
Capt.Krusty

176

is.element() sorgt für besser lesbaren Code und ist identisch mit %in%

v <- c('a','b','c','e')

is.element('b', v)
'b' %in% v
## both return TRUE

is.element('f', v)
'f' %in% v
## both return FALSE

subv <- c('a', 'f')
subv %in% v
## returns a vector TRUE FALSE
is.element(subv, v)
## returns a vector TRUE FALSE

6
Ich weiß, dass die Dokumentation sagt is.element(x, y) is identical to x %in% y. Aber ich weiß nicht warum, is.elementsfunktioniert beim Mischen von ganzen Zahlen und Zahlen und %in%nicht
pomber

@pomber: Könnten Sie ein Beispiel dafür geben?
Discipulus

@ Pomber ist es behoben?
Vasili111

2
Die überlegene Lesbarkeit is.element()gegenüber %in%ist subjektiv. Es kann der Fall angeführt werden, dass ein Infix-Operator besser lesbar ist, da dadurch Mehrdeutigkeiten in der Reihenfolge der Argumente beseitigt werden. apple in fruitmacht Sinn, fruit in applenicht. is.element(apple, fruit)oder is.element(fruit, apple)beide könnten je nach Implementierung der is.elementFunktion richtig sein .
Rileymcdowell

70

Ich werde die Optionen basierend auf der Ausgabe gruppieren. Nehmen Sie für alle Beispiele den folgenden Vektor an.

v <- c('z', 'a','b','a','e')

Zur Überprüfung der Anwesenheit:

%im%

> 'a' %in% v
[1] TRUE

irgendein()

> any('a'==v)
[1] TRUE

is.element ()

> is.element('a', v)
[1] TRUE

Um das erste Vorkommen zu finden:

Spiel()

> match('a', v)
[1] 2

Um alle Vorkommen als Vektor von Indizes zu finden:

welche()

> which('a' == v)
[1] 2 4

Um alle Vorkommen als logischen Vektor zu finden :

==

> 'a' == v
[1] FALSE  TRUE FALSE  TRUE FALSE

Bearbeiten: Entfernen von grep () und grepl () aus der Liste aus den in den Kommentaren genannten Gründen


6
Verwenden Sie, wie hier und hier bereits kommentiert , keine grep()regulären Ausdrücke, um genaue Übereinstimmungen zu finden.
Uwe

69

Die Funktion any () sorgt für lesbaren Code

> w <- c(1,2,3)
> any(w==1)
[1] TRUE

> v <- c('a','b','c')
> any(v=='b')
[1] TRUE

> any(v=='f')
[1] FALSE

9
Beachten Sie, dass sich dies anders verhält als %in%: any(1==NA)return NA, where 1 %in% NAreturn FALSE.

@ user3603486: Gibt any(1==NA, na.rm=TRUE)zurück FALSE.
AkselA

36

Sie können den %in%Operator verwenden:

vec <- c(1, 2, 3, 4, 5)
1 %in% vec # true
10 %in% vec # false

19

Auch um die Position des Elements zu finden, "welches" als verwendet werden kann

pop <- c(3,4,5,7,13)

which(pop==13)

und um die Elemente zu finden, die nicht im Zielvektor enthalten sind, kann man dies tun:

pop <- c(1,2,4,6,10)

Tset <- c(2,10,7)   # Target set

pop[which(!(pop%in%Tset))]

whichist eigentlich manchmal vorzuziehen, da es Ihnen im Gegensatz zu allen übereinstimmenden Positionen (als Array) gibt match. Obwohl dies vielleicht nicht das war, was das OP verlangte, im Gegensatz zu stackoverflow.com/questions/1169388/…
Fizz

2
Warum sich die Mühe machen, whichwenn Sie nur die Elemente finden möchten, die nicht in sind Tset? Sie können einfach popdirekt indizieren . pop[!pop%in%Tset]
Houshalter

13

Ich mag grep () und grepl () zu diesem Zweck sehr.

grep () gibt einen Vektor von ganzen Zahlen zurück, der angibt, wo Übereinstimmungen sind.

yo <- c("a", "a", "b", "b", "c", "c")

grep("b", yo)
[1] 3 4

grepl () gibt einen logischen Vektor mit "TRUE" an der Stelle der Übereinstimmungen zurück.

yo <- c("a", "a", "b", "b", "c", "c")

grepl("b", yo)
[1] FALSE FALSE  TRUE  TRUE FALSE FALSE

Diese Funktionen unterscheiden zwischen Groß- und Kleinschreibung.


10
Standardmäßig wird grepein regulärer Ausdruck als erstes Element verwendet, um eine genaue Übereinstimmung zu erzielen "b"(entweder verwenden ^e$oder hinzufügen , fixed=TRUE).
Reinierpost

10
Verwenden Sie Regex nicht für genaue Übereinstimmungen. Dies ist gefährlich und kann unerwartete Ergebnisse haben
David Arenburg

9
Ja, das ist eine schreckliche, keine gute, sehr schlechte Idee - ineffizient und garantiert kaputt. ZB myvar <- 'blah'; grepl('b', myvar, fixed=TRUE)wird zurückkehren TRUE, obwohl 'b' nicht in ist myvar.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.