376 Stimmen

Gegenteil von %in%: Zeilen mit in einem Vektor angegebenen Werten ausschließen

Eine kategoriale Variable V1 in einem Datenrahmen D1 kann Werte haben, die durch die Buchstaben von A bis Z dargestellt werden. Ich möchte eine Teilmenge D2 erstellen, die einige Werte ausschließt, z. B. B, N und T. Im Grunde möchte ich einen Befehl, der das Gegenteil von %in%

D2 = subset(D1, V1 %in% c("B", "N", "T"))

491voto

Sacha Epskamp Punkte 44955

Sie können die ! Operator, um grundsätzlich jedes TRUE FALSE und jedes FALSE TRUE zu machen:

D2 = subset(D1, !(V1 %in% c('B','N','T')))

EDIT: Sie können auch selbst einen Operator erstellen:

'%!in%' <- function(x,y)!('%in%'(x,y))

c(1,3,11)%!in%1:10
[1] FALSE FALSE  TRUE

111voto

Spencer Castro Punkte 1255

Wie wäre es damit:

`%ni%` <- Negate(`%in%`)
c(1,3,11) %ni% 1:10
# [1] FALSE FALSE  TRUE

61voto

user29609 Punkte 1821

Hier ist eine Version mit filter en dplyr die die gleiche Technik wie die akzeptierte Antwort anwendet, indem sie das Logische mit ! negiert:

D2 <- D1 %>% dplyr::filter(!V1 %in% c('B','N','T'))

36voto

Marek Punkte 47395

Wenn Sie sich den Code von %in%

 function (x, table) match(x, table, nomatch = 0L) > 0L

dann sollten Sie in der Lage sein, Ihre Version des Gegenteils zu schreiben. Ich verwende

`%not in%` <- function (x, table) is.na(match(x, table, nomatch=NA_integer_))

Eine andere Möglichkeit ist:

function (x, table) match(x, table, nomatch = 0L) == 0L

17voto

EllaK Punkte 209

Verwendung von negate von purrr erledigt auch diese Aufgabe schnell und sauber:

`%not_in%` <- purrr::negate(`%in%`)

Dann ist die Verwendung zum Beispiel,

c("cat", "dog") %not_in% c("dog", "mouse")

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X