% এর% এর বিপরীতে


262

ডেটা ফ্রেম ডি 1 এ একটি শ্রেণিবদ্ধ ভেরিয়েবল ভি 1 এর এ থেকে জেড পর্যন্ত বর্ণগুলি দ্বারা প্রতিনিধিত্ব করা মান থাকতে পারে I আমি একটি উপসেট ডি 2 তৈরি করতে চাই যা কিছু মান বাদ দেয় না, বলুন, বি, এন এবং টি মূলত, আমি একটি কমান্ড চাই যা এর বিপরীত %in%

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

66
না%? ( !(x %in% y))। জীবন কখনও কখনও সহজ হতে পারে ...
জোরিস মাইস

উত্তর:


354

আপনি !অপারেটরটি মূলত কোনও সত্য মিথ্যা এবং প্রতিটি মিথ্যা সত্য করতে ব্যবহার করতে পারেন । তাই:

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%
আইআরটিএফএম

23
এছাড়াও, দেখতে ?Negateযেমন"%ni%" <- Negate("%in%")
Baptiste

2
নতুন অপারেটর সংজ্ঞায়নের পরে ব্যাগটিস্টের পরামর্শ অনুসারে ব্যবহার করার সময় নেগেট আমার জন্য কাজ করেছিল, যেমন subset(df, variable %ni% c("A", "B")), তবে সরাসরি ব্যবহার করা হয় না যেমন ,subset(df, variable Negate("%in%") c("A", "B"))
প্যাট্রিকটি

2
@ পেট্রিকটি কারণ এটি কেবল অপারেটর অপারেটর হিসাবে ব্যবহার করা যেতে পারে। এবং অপারেটরগুলি হয় অন্তর্নির্মিত হয় বা শুরু করে শেষ হয় %। অপারেটর তৈরি করতে, আপনাকে একটি নামের শুরু এবং শেষ দিয়ে দুটি অপারেন্ড সহ একটি ফাংশন নির্ধারণ করতে হবে %
উড়ন্ত ভেড়া


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একই কাজ করে। পার্থক্য কেবলমাত্র as_mapperততক্ষণ যে Negateকলটি আপনি পাস করেন সেদিকে কল করে match.funrdocamentation.org/packages/purrr/versions/0.2.5/topics/… স্ট্যাট.থজ.চ.আর
উড়ন্ত ভেড়া

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

যদিও এটি সঠিক উত্তর হতে পারে তবে এটি কেন কাজ করে তার অতিরিক্ত ব্যাখ্যা সহ এটি আরও কার্যকর হবে be আরও বিশদ অন্তর্ভুক্ত করার জন্য এটি সম্পাদনা বিবেচনা করুন, এবং আপনি যদি মনে করেন এটি গ্রহণযোগ্য উত্তরের চেয়ে ভাল যা প্রায় এক দশক আগে পোস্ট করা হয়েছিল।
জেরেমি কেনে


-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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.