% में% के विपरीत


262

डेटा फ़्रेम D1 में एक श्रेणीबद्ध चर V1 में A से Z तक के अक्षरों द्वारा दर्शाए गए मान हो सकते हैं। मैं एक सबसेट D2 बनाना चाहता हूं, जिसमें कुछ मानों को शामिल किया गया है, कहते हैं, B, N और T। मूल रूप से, मुझे एक कमांड चाहिए। इसके वीरूद्ध %in%

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

66
अंदर नही%? ( !(x %in% y))। जीवन कभी-कभी आसान हो सकता है ...
जॉरिस मेस

जवाबों:


354

आप !मूल रूप से किसी भी TRUE FALSE और हर FALSE TRUE को बनाने के लिए ऑपरेटर का उपयोग कर सकते हैं । इसलिए:

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

संपादित करें: आप अपने आप को एक ऑपरेटर भी बना सकते हैं:

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

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

5
दूसरे विकल्प का उपयोग मदद (मिलान) पृष्ठ (जहां आपको टाइप करने के लिए मिलता है) में चित्रित किया ?"%in%"जाता है जहां नया ऑपरेटर कहा जाता है %w/o%
IRTFM

23
यह भी देखें, ?Negateउदाहरण"%ni%" <- Negate("%in%")
बपतिस्मा-

2
नए ऑपरेटर को परिभाषित करने के बाद इस्तेमाल किए जाने पर नेगेट ने मेरे लिए काम किया, जैसा कि बपतिस्मा देने वाले ने सुझाया था, उदाहरण के लिए subset(df, variable %ni% c("A", "B")), लेकिन सीधे इस्तेमाल किए जाने पर नहीं, उदाहरण के लिएsubset(df, variable Negate("%in%") c("A", "B"))
पैट्रिकटी

2
@PatrickT ऐसा इसलिए है क्योंकि केवल ऑपरेटरों को ऑपरेटर के रूप में इस्तेमाल किया जा सकता है। और ऑपरेटर या तो बिल्ट-इन या शुरू और समाप्त होते हैं %। एक ऑपरेटर बनाने के लिए, आपको दो ऑपरेंड के साथ एक फ़ंक्शन असाइन करना होगा, जिसका नाम शुरू और समाप्त होगा %
उड़ान भेड़


31

यदि आप के कोड को देखो %in%

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

तो आप अपने विपरीत के संस्करण लिखने में सक्षम होना चाहिए। मैं उपयोग करता हूं

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

एक और तरीका है:

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

उत्कृष्ट समाधान..यह काम तब किया जब नियमित रूप से नकारने में विफल रहा।
अगाथा

17

यहां एक संस्करण का उपयोग किया filterगया है dplyrजो तार्किक के साथ नकारात्मक को स्वीकार करते हुए उसी तकनीक को लागू करता है !:

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

12

का प्रयोग negateसे purrrभी जल्दी से और बड़े करीने से काम कर देता है:

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

उदाहरण के लिए, तब उपयोग होता है,

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

2
वहाँ भी एक अंतर्निहित है Negateकि एक ही है। अंतर केवल इतना है कि purrr as_mapperआपके द्वारा पास की गई चीज़ पर कॉल करता है, जबकि Negateकॉल करता है match.funrdocumentation.org/packages/purrr/versions/0.2.5/topics/… stat.ethz.ch/R-manual/R-devel/library/base/html/match.fun.html
फ्लाइंग

7

purrr::compose() बाद में उपयोग के लिए इसे परिभाषित करने का एक और त्वरित तरीका है:

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

3

एक और समाधान का उपयोग किया जा सकता है setdiff

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

D2 = setdiff(D1, D0)

D2 आपका वांछित सबसेट है।



0

मुझे लगता है कि स्पष्ट उपयोग सिर्फ है

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

यह पहले से ही यहां पोस्ट किए गए उत्तरों से काफी अलग कैसे है?
कैमिला

0
library(roperators)

1 %ni% 2:10

हालांकि यह एक सही उत्तर हो सकता है, यह अतिरिक्त स्पष्टीकरण के साथ अधिक उपयोगी होगा कि यह क्यों काम करता है। आगे के विवरणों को शामिल करने के लिए इसे संपादित करने पर विचार करें, और यदि आपको लगता है कि यह स्वीकृत उत्तर से बेहतर है जो लगभग एक दशक पहले पोस्ट किया गया था।
जेरेमी कैनी


-1

help("%in%")उदाहरण के लिए, इस अनुभाग में % में% के लिए सहायता , शामिल है, इस परिभाषा में,

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

चलो यह कोशिश करते हैं:

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

वैकल्पिक रूप से

"%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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.