Der %in%
Operator teilt Ihnen mit, welche Elemente zu den zu entfernenden Zahlen gehören:
> a <- sample (1 : 10)
> remove <- c (2, 3, 5)
> a
[1] 10 5 2 7 1 6 3 4 8 9
> a %in% remove
[1] FALSE TRUE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
> a [! a %in% remove]
[1] 10 7 1 6 4 8 9
Beachten Sie, dass dadurch unvergleichliche Elemente (wie NA
oder Inf)
auch) stillschweigend entfernt werden (während doppelte Werte beibehalten werden, a
solange sie nicht in aufgeführt sind remove
).
Wenn a
es unvergleichliche Elemente enthalten kann, dies aber remove
nicht wird, können wir es verwenden match
und es anweisen, 0
für Nichtübereinstimmungen und unvergleichbare Daten zurückzukehren ( %in%
ist eine bequeme Abkürzung für match
):
> a <- c (a, NA, Inf)
> a
[1] 10 5 2 7 1 6 3 4 8 9 NA Inf
> match (a, remove, nomatch = 0L, incomparables = 0L)
[1] 0 3 1 0 0 0 2 0 0 0 0 0
> a [match (a, remove, nomatch = 0L, incomparables = 0L) == 0L]
[1] 10 7 1 6 4 8 9 NA Inf
incomparables = 0
wird nicht benötigt, da unvergleichliche Daten sowieso nicht übereinstimmen, aber ich würde es aus Gründen der Lesbarkeit einschließen.
Dies ist übrigens das, was setdiff
intern geschieht (aber ohne die unique
Duplikate wegzuwerfen, in a
denen nicht enthalten sind remove
).
Wenn es remove
unvergleichliche Elemente enthält, müssen Sie diese einzeln prüfen, z
if (any (is.na (remove)))
a <- a [! is.na (a)]
(Dies unterscheidet nicht NA
vonNaN
aber das R-Handbuch warnt trotzdem davor, dass man sich nicht darauf verlassen sollte, einen Unterschied zwischen ihnen zu haben.)
Für Inf
/ müssen -Inf
Sie beide sign
und überprüfenis.finite
cbeleites unzufrieden mit SX
quelle
setdiff
ist besser, da es alles in einer Operation erledigt und nur einmal auf den geänderten Vektor verweist.a
, die nichtremove
ebenfalls vorhanden sind. Wenn das kein Problem ist, können Sie auch verwendensetdiff
.setdiff
Übrigens, verwendet,match
für die%in%
eine Verknüpfung ist.Sie können verwenden
setdiff
.Gegeben
Dann
quelle
a
das Ergebnis einer anderen Funktion ist, so dass Sie Dinge in einer Zeile anstelle von 3 und einer temporären Variablen%in%
Lösung, wenn der Eingabevektor Duplikate enthält (in diesem Fallsetdiff
wird nur die eindeutige Menge zurückgegeben , dh ohne Duplikate)fsetdiff
ofdata.table
package hat einall
Flag (Standard F), mit dem Duplikate im Eingabevektor beibehalten werden können.Sie können dies wie folgt tun:
In Kürze
quelle
which
. Es ist im Grunde das gleiche wie die Antwort von @cbeleites.which
Gibt Indizes von TRUE-Werten zurück. Das Minuszeichen kann also verwendet werden, um "die anderen Indizes als diese Indizes" zu sagen. Auchwhich
ist besser lesbar, da es näher an der natürlichen Sprache ist.anstatt
Mit den Paketen
purrr
undmagrittr
können Sie:dies ermöglicht
subset
ting die Vektornamen nur einmal verwenden. Und du kannst es in Rohren verwenden :)quelle
Zuerst können wir einen neuen Operator definieren,
Dann ist es wie x nicht in entfernen
oder warum zum Entfernen gehen, gehen Sie direkt
quelle
AKTUALISIEREN:
Alle oben genannten Antworten funktionieren nicht für die wiederholten Werte. Die Antwort von @ BenBolker unter Verwendung eines
duplicated()
Prädikats löst Folgendes :Ursprüngliche Antwort: Hier schreibe ich eine kleine Funktion dafür:
Also, sagen wir mal
full_vector=c(1,2,3,4,1)
undsearched_vector=c(1,2,3)
.exclude_val(full_vector,searched_vector)
wird zurückkehren (4,1), jedoch werden die obigen Antworten nur zurückgeben(4)
.quelle
full_vector[!full_vector %in% searched_vector | duplicated(full_vector)]
?full_vector = c(1,1,1,2,3); searched_vector = c(1,1,3);
- das ergibt1, 1, 2
anstelle der richtigen Antwort1, 2
.removeif <- function(from, where) { for (i in where) if (i %in% from) {from = from[-match(i, from)]}; from}
Dies setzt die 13 in einem Vektor auf keine Zahl (NAN), die falsches Entfernen anzeigt (q [c (11,12,13)]). Wenn Sie dies versuchen, werden Sie feststellen, dass die Entfernungsfunktion bei der Vektornummer nicht funktioniert. Sie entfernen den gesamten Vektor, aber möglicherweise kein einzelnes Element.
quelle
Es gibt auch
subset
Dinge, die manchmal nützlich sein können:quelle