Wie überprüfe ich, ob ein Vektor einen bestimmten Wert enthält?
%
Zeichen. Das Wort in
ist ein reserviertes Wort in R, das in der For-Loop-Konstruktion verwendet wird.
select(iris, contains("etal"))
.
Wie überprüfe ich, ob ein Vektor einen bestimmten Wert enthält?
%
Zeichen. Das Wort in
ist ein reserviertes Wort in R, das in der For-Loop-Konstruktion verwendet wird.
select(iris, contains("etal"))
.
Antworten:
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
which(v, 'b')
. Beachten Sie die Reihenfolge der Argumente.
which(v, 'b')
geben mir eine Fehlermeldung:> Fehler in dem (v, 'b'): Argument zu 'welches' nicht logisch ist
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
is.element(x, y) is identical to x %in% y
. Aber ich weiß nicht warum, is.elements
funktioniert beim Mischen von ganzen Zahlen und Zahlen und %in%
nicht
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 fruit
macht Sinn, fruit in apple
nicht. is.element(apple, fruit)
oder is.element(fruit, apple)
beide könnten je nach Implementierung der is.element
Funktion richtig sein .
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
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
%in%
: any(1==NA)
return NA
, where 1 %in% NA
return FALSE
.
any(1==NA, na.rm=TRUE)
zurück FALSE
.
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))]
which
ist 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/…
which
wenn Sie nur die Elemente finden möchten, die nicht in sind Tset
? Sie können einfach pop
direkt indizieren . pop[!pop%in%Tset]
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.
grep
ein regulärer Ausdruck als erstes Element verwendet, um eine genaue Übereinstimmung zu erzielen "b"
(entweder verwenden ^e$
oder hinzufügen , fixed=TRUE
).