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
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]24
Um alle Vorkommen als logischen Vektor zu finden :
==
>'a'== v
[1]FALSETRUEFALSETRUEFALSE
Bearbeiten: Entfernen von grep () und grepl () aus der Liste aus den in den Kommentaren genannten Gründen
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]34
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]FALSEFALSETRUETRUEFALSEFALSE
Diese Funktionen unterscheiden zwischen Groß- und Kleinschreibung.
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.
%
Zeichen. Das Wortin
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.quelle
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 istis.element()
sorgt für besser lesbaren Code und ist identisch mit%in%
quelle
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%
nichtis.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)
oderis.element(fruit, apple)
beide könnten je nach Implementierung deris.element
Funktion richtig sein .Ich werde die Optionen basierend auf der Ausgabe gruppieren. Nehmen Sie für alle Beispiele den folgenden Vektor an.
Zur Überprüfung der Anwesenheit:
%im%
irgendein()
is.element ()
Um das erste Vorkommen zu finden:
Spiel()
Um alle Vorkommen als Vektor von Indizes zu finden:
welche()
Um alle Vorkommen als logischen Vektor zu finden :
==
Bearbeiten: Entfernen von grep () und grepl () aus der Liste aus den in den Kommentaren genannten Gründen
quelle
grep()
regulären Ausdrücke, um genaue Übereinstimmungen zu finden.Die Funktion any () sorgt für lesbaren Code
quelle
%in%
:any(1==NA)
returnNA
, where1 %in% NA
returnFALSE
.any(1==NA, na.rm=TRUE)
zurückFALSE
.Sie können den
%in%
Operator verwenden:quelle
Auch um die Position des Elements zu finden, "welches" als verwendet werden kann
und um die Elemente zu finden, die nicht im Zielvektor enthalten sind, kann man dies tun:
quelle
which
ist eigentlich manchmal vorzuziehen, da es Ihnen im Gegensatz zu allen übereinstimmenden Positionen (als Array) gibtmatch
. 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 sindTset
? Sie können einfachpop
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.
grepl () gibt einen logischen Vektor mit "TRUE" an der Stelle der Übereinstimmungen zurück.
Diese Funktionen unterscheiden zwischen Groß- und Kleinschreibung.
quelle
grep
ein regulärer Ausdruck als erstes Element verwendet, um eine genaue Übereinstimmung zu erzielen"b"
(entweder verwenden^e$
oder hinzufügen, fixed=TRUE
).myvar <- 'blah'; grepl('b', myvar, fixed=TRUE)
wird zurückkehrenTRUE
, obwohl 'b' nicht in istmyvar
.