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 filter
gebruikt in dplyr
die 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 negate
van purrr
doet 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 Hmisc
heeft 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