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

518

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

Medriscoll
quelle
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
Medriscoll
quelle
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
Justin Nafe
quelle
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

ishandutta2007
quelle
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
Dan Goldstein
quelle
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
ars
quelle
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))]
Armin
quelle
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.

ojdajuiceman
quelle
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.