% Cinsinden% cinsinden


262

Bir veri çerçevesindeki D1 kategorik bir değişken V1, A'dan Z'ye kadar harflerle temsil edilen değerlere sahip olabilir. B, N ve T gibi bazı değerleri hariç tutan bir D2 alt kümesi oluşturmak istiyorum. Temel olarak, bir komut istiyorum karşıtı %in%

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

66
değil%? ( !(x %in% y)). Hayat bazen kolay olabilir ...
Joris Meys

Yanıtlar:


355

!Temel olarak herhangi bir DOĞRU YANLIŞ ve her YANLIŞ DOĞRU yapmak için operatörü kullanabilirsiniz . yani:

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

DÜZENLEME: Ayrıca kendiniz bir operatör de yapabilirsiniz:

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

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

5
İkinci seçeneğin kullanımı ?"%in%", yeni operatörün çağrıldığı yardım (eşleşme) sayfasında (yazdıysanız alacağınız yer ) gösterilir %w/o%.
IRTFM

23
Ayrıca, bakınız ?Negate, örneğin"%ni%" <- Negate("%in%")
Baptiste

2
Negate, baptiste tarafından önerildiği gibi yeni operatörü tanımladıktan sonra kullanıldığında benim için çalıştı subset(df, variable %ni% c("A", "B")), ancak doğrudan kullanıldığında, örn.subset(df, variable Negate("%in%") c("A", "B"))
PatrickT

2
@PatrickT bunun nedeni, yalnızca işleçlerin işleç olarak kullanılabilmesidir. ve operatörler yerleşiktir veya ile başlar ve biter %. Bir işleç oluşturmak için ile başlayan ve biten bir ada iki işlenenli bir işlev atamanız gerekir %.
uçan koyun


31

Eğer koduna bakarsanız %in%

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

o zaman karşıt versiyonunuzu yazabilmelisiniz. kullanırım

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

Başka bir yol:

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

mükemmel çözüm .. Düzenli olumsuzlama başarısız olduğunda çalıştı.
agatha

17

İşte kullanan bir versiyonudur filteriçinde dplyrbununla mantıksal olumsuzlaştırılmasıyla kabul yanıt olarak aynı tekniği geçerlidir!:

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


7

purrr::compose() aşağıdaki gibi, bunu daha sonra kullanmak üzere tanımlamanın başka bir hızlı yoludur:

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

3

Başka bir çözüm setdiff

D1 = c("A",..., "Z") ; D0 = c("B","N","T")

D2 = setdiff(D1, D0)

D2 istediğiniz alt kümedir.



0

Bence en net kullanım sadece

!('Spain' %in% c('Germany', 'France', 'Italy'))

Bu, daha önce burada verilen cevaplardan önemli ölçüde farklı mıdır?
camille

0
library(roperators)

1 %ni% 2:10

Bu doğru bir cevap olsa da, neden işe yaradığına dair ek açıklama ile daha yararlı olacaktır . Daha fazla ayrıntı içerecek şekilde düzenlemeyi düşünün ve neredeyse on yıl önce gönderilen kabul edilen cevaptan daha iyi olduğunu düşünüyorsanız.
Jeremy Caney


-1

% İçindeki% için yardım help("%in%"), Örnekler bölümünde,

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

Hadi deneyelim:

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

alternatif olarak

"%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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.