Tegenovergestelde van %in%: rijen uitsluiten met waarden gespecificeerd in een vector

Een categorische variabele V1 in een dataframe D1 kan waarden hebben die worden weergegeven door de letters van A tot Z. Ik wil een subset D2 maken die sommige waarden uitsluit, bijvoorbeeld B, N en T. In principe wil ik een commando dat het tegenovergestelde is van %in%

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

Antwoord 1, autoriteit 100%

Je kunt de operator !gebruiken om in principe elke TRUE FALSE en elke FALSE TRUE te maken. dus:

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

BEWERKEN:
U kunt ook zelf een operator maken:

'%!in%' <- function(x,y)!('%in%'(x,y))
c(1,3,11)%!in%1:10
[1] FALSE FALSE  TRUE

Antwoord 2, autoriteit 19%

Wat dacht je van:

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

Antwoord 3, autoriteit 8%

Hier is een versie die filtergebruikt in dplyrdie dezelfde techniek toepast als het geaccepteerde antwoord door het logische te ontkennen met !:

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

Antwoord 4, autoriteit 7%

Als je kijkt naar de code van %in%

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

dan zou je jouw versie van het tegenovergestelde moeten kunnen schrijven. ik gebruik

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

Een andere manier is:

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

5, Autoriteit 4%

met behulp van negatevan purrrdoet ook de truc snel en netjes:

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

Dan is het gebruik bijvoorbeeld

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

6, Autoriteit 2%

purrr::compose()is een andere snelle manier om dit te definiëren voor later gebruik, zoals in:

`%!in%` <- compose(`!`, `%in%`)

7, Autoriteit 2%

In plaats van uw eigen functie te maken, zou het nuttig zijn om het gedrag van

te ontkennen

needle %in% haystack 

doe dit in plaats daarvan:

!(needle %in% haystack)

Dit werkt ook.


8

HMISC heeft %nin%-functie, die dit zou moeten doen.

https: //www.rdocumentation. Org / pakketten / hmisc / versies / 4,4-0 / onderwerpen /% 25nin% 25


9

Dit werkt goed voor mij:

`%nin%` <- Negate(`%in%`)

10

Niet nodig om jezelf te definiëren. Het pakket Hmischeeft de bediener %nin%.

library(Hmisc)
"A" %nin% c("A","B")
#[1] FALSE
"A" %nin% c("C","B")
#[1] TRUE

11

De hulp voor% in%, help("%in%"), omvat, in het gedeelte Voorbeelden, deze definitie van niet in,

"%w/o%" <- function(x, y) x[!x %in% y] #-- x without y

Laten we het proberen:

c(2,3,4) %w/o% c(2,8,9)
[1] 3 4

alternatief

"%w/o%" <- function(x, y) !x %in% y #--  x without y
c(2,3,4) %w/o% c(2,8,9)
# [1] FALSE  TRUE  TRUE

12

require(TSDT)
c(1,3,11) %nin% 1:10
# [1] FALSE FALSE  TRUE

Voor meer informatie kunt u verwijzen naar: https: // cran.r-project.org/web/packages/tsdt/tsdt.pdf


13

library(roperators)
1 %ni% 2:10

Als u regelmatig aangepaste Infix-operators moet gebruiken, is het gemakkelijker om ze gewoon in een pakket te hebben in plaats van dezelfde exacte functies te verklaren in elk script of het project.


Antwoord 14

Het samenvouwen van het pakket heeft het ingebouwd: %!in%.


Antwoord 15

Of misschien gewoon 😉

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

Other episodes