কোনও ভেক্টর থেকে একাধিক মান কীভাবে মুছবেন?


125

আমার মতো ভেক্টর রয়েছে: a = c(1:10)এবং আমার একাধিক মান মুছে ফেলতে হবে, যেমন:2, 3, 5

ভেক্টরে কীভাবে এই সংখ্যাগুলি (তারা ভেক্টরের অবস্থান নয় ) মুছবেন ?

এই মুহুর্তে আমি ভেক্টরটি লুপ করব এবং এর মতো কিছু করব:

a[!a=NUMBER_TO_REMOVE]

তবে আমি মনে করি একটি ফাংশন রয়েছে যা এটি স্বয়ংক্রিয়ভাবে ঘটে।

উত্তর:


192

%in%অপারেটর আপনি বলে যা উপাদান মুছে ফেলার জন্য numers মধ্যে আছেন:

> a <- sample (1 : 10)
> remove <- c (2, 3, 5)
> a
 [1] 10  5  2  7  1  6  3  4  8  9
> a %in% remove
 [1] FALSE  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
> a [! a %in% remove]
 [1] 10  7  1  6  4  8  9

নোট করুন যে এটি নিঃশব্দে অতুলনীয় অপসারণ করবে (স্টাফগুলি পছন্দ মতো NAবা Inf)পাশাপাশি (যখন এটি ডুপ্লিকেট মানগুলিকে aতালিকায় না রাখে ততক্ষণ রাখে remove))।

  • যদি অপ্রয়োজনীয় aথাকতে পারে তবে removeতা না থাকলে আমরা এটি ব্যবহার না করে ম্যাচগুলি এবং অতুলনীয়গুলির জন্য matchফিরে আসতে বলি 0(এর %in%জন্য একটি সংক্ষিপ্ত শর্টকাট match):

    > a <- c (a, NA, Inf)
    > a
     [1]  10   5   2   7   1   6   3   4   8   9  NA Inf
    > match (a, remove, nomatch = 0L, incomparables = 0L)
     [1] 0 3 1 0 0 0 2 0 0 0 0 0
    > a [match (a, remove, nomatch = 0L, incomparables = 0L) == 0L]
    [1]  10   7   1   6   4   8   9  NA Inf
    

    incomparables = 0অপ্রয়োজনীয় যাই হোক না কেন মেলে না কারণ এটি প্রয়োজন হয় না , তবে আমি এটি পঠনযোগ্যতার জন্য অন্তর্ভুক্ত করব।
    এটি, বিটিডাব্লু।, setdiffঅভ্যন্তরীণভাবে কী করে (তবে uniqueডুপ্লিকেটগুলি না ফেলে aযার মধ্যে নেই remove)।

  • যদি removeঅতুলনীয় থাকে তবে আপনাকে পৃথকভাবে তাদের পরীক্ষা করতে হবে, যেমন

    if (any (is.na (remove))) 
      a <- a [! is.na (a)]
    

    (এই পার্থক্য নেই NAথেকে NaNকিন্তু আর ম্যানুয়াল কোন পথে সাবধান তাদের মধ্যে একটি পার্থক্য থাকার উপর যে এক নির্ভর হওয়া উচিত নয়)

    জন্য Inf/ -Infআপনি উভয় পরীক্ষা করতে হবে signএবংis.finite


1
setdiffআরও ভাল, যেমন এটি একটি ক্রিয়াকলাপে সমস্ত কিছু করে এবং কেবল একবার সংশোধিত ভেক্টরকে উল্লেখ করে।
অলেক্সা

1
@Olexa: SET পার্থক্য সবসময় একটি ভেক্টর থেকে সংখ্যার একটি প্রদত্ত সারি সব occurences সরানোর হিসাবে একই নয় এতে সদৃশ মুছে ফেলা হবে aযে হয় না removeপাশাপাশি। যদি এটি কোনও সমস্যা না হয় তবে আপনি এটিও ব্যবহার করতে পারেন setdiffsetdiff, বিটিডব্লিউ, matchযার %in%জন্য একটি শর্টকাট uses
এসবিএক্স

97

আপনি ব্যবহার করতে পারেন setdiff

প্রদত্ত

a <- sample(1:10)
remove <- c(2, 3, 5)

তারপর

> a
 [1] 10  8  9  1  3  4  6  7  2  5
> setdiff(a, remove)
[1] 10  8  9  1  4  6  7

1
খুব কার্যকর যখন aঅন্য ফাংশনের ফলাফল হয় আপনি 3 এর পরিবর্তে এক লাইনে জিনিসগুলি করতে পারেন এবং একটি অস্থায়ী ভেরিয়েবল
jf328

14
এটি %in%ইনপুট ভেক্টরটিতে ডুপ্লিকেট থাকে তবে এটি সমাধানের চেয়ে পৃথক ফলাফল আনতে পারে (যার ক্ষেত্রে setdiffকেবল অনন্য সেট , যেমন ডুপ্লিকেট ছাড়াই ফিরে আসবে )
তালাত

2
@docendodiscimus: fsetdiffএর data.tableপ্যাকেজের একটি allপতাকা রয়েছে (ডিফল্ট এফ) যা ইনপুট ভেক্টরে নকল রাখতে পারে।
জুয়ারজেন

9

আপনি নিম্নলিখিত হিসাবে এটি করতে পারেন:

> x<-c(2, 4, 6, 9, 10) # the list
> y<-c(4, 9, 10) # values to be removed

> idx = which(x %in% y ) # Positions of the values of y in x
> idx
[1] 2 4 5
> x = x[-idx] # Remove those values using their position and "-" operator
> x
[1] 2 6

শীঘ্র

> x = x[ - which(x %in% y)]

1
আপনি আপনার উদাহরণে একটি তালিকা কল করছেন যা ভেক্টর, তাই না?
প্যাট্রিক

হ্যাঁ আমি ভেক্টর বলতে চাইছি। মন্তব্যের জন্য ধন্যবাদ.
ykpemre

এখানে কোন প্রয়োজন whichনেই। এটি মূলত @cbeleites উত্তরের মতো।
ডেভিড আরেনবুর্গ

হ্যাঁ এটি একই, তবে কয়েকটি দৃষ্টিতে পৃথক। whichসত্য মানের সূচকগুলি প্রদান করে। সুতরাং বিয়োগ চিহ্নটি "এই সূচকগুলি বাদে অন্য সূচকগুলি" বলতে ব্যবহৃত হতে পারে। এছাড়াও whichযেহেতু এটি কাছাকাছি প্রাকৃতিক ভাষা আরো পাঠযোগ্য।
ykpemre

4

পরিবর্তে

x <- x[! x %in% c(2,3,5)]

প্যাকেজগুলি ব্যবহার করে purrrএবং magrittrআপনি এটি করতে পারেন:

your_vector %<>% discard(~ .x %in% c(2,3,5))

এটি subsetকেবল একবার ভেক্টর নাম ব্যবহার করে টিংয়ের অনুমতি দেয় । এবং আপনি এটি পাইপগুলিতে ব্যবহার করতে পারেন :)


আপনি দয়া করে ভেরিয়েবল নামের দৈর্ঘ্য সম্পর্কে আপনার শেষ বিবৃতিটি ব্যাখ্যা করতে পারেন? কেন আপনি পছন্দ করেন না? কেন অন্য উপায়ের চেয়ে ভাল? অথবা, যে অনুচ্ছেদটি মূল ইস্যু / প্রশ্নের সাথে সম্পর্কিত নয়, সেই অনুচ্ছেদটি সরান।
রডরিগপ

2

প্রথমে আমরা একটি নতুন অপারেটর সংজ্ঞায়িত করতে পারি,

"%ni%" = Negate( "%in%" )

তারপরে, এর মতো এক্স সরিয়ে নেই

x <- 1:10
remove <- c(2,3,5)
x <- x[ x %ni% remove ]

বা সরানোর জন্য কেন যেতে হবে, সরাসরি যান

x <- x[ x %ni% c(2,3,5)]

3
প্রশ্নটি সুনির্দিষ্টভাবে বলে যে 2, 3 এবং 5 ভেক্টরের অবস্থান নয়।
ব্লেকফট

1

হালনাগাদ:

উপরের সমস্ত উত্তর পুনরাবৃত্ত মানগুলির জন্য কাজ করবে না, @ বেনবোলকারের উত্তর প্রাক্টিকেট ব্যবহার duplicated()করে এটি সমাধান করে:

full_vector[!full_vector %in% searched_vector | duplicated(full_vector)]

আসল উত্তর: এখানে আমি এর জন্য একটি সামান্য ফাংশন লিখছি:

exclude_val<-function(full_vector,searched_vector){

      found=c()

      for(i in full_vector){  

        if(any(is.element(searched_vector,i))){
          searched_vector[(which(searched_vector==i))[1]]=NA
        }
        else{
          found=c(found,i)
        }
    }

    return(found)
}

সুতরাং, এর full_vector=c(1,2,3,4,1)এবং বলা যাক searched_vector=c(1,2,3)

exclude_val(full_vector,searched_vector)(4,1) ফিরে আসবে, তবে উপরের উত্তরগুলি কেবল ফিরে আসবে (4)


1
কি full_vector[!full_vector %in% searched_vector | duplicated(full_vector)]?
বেন বলকার

@ বেনবোলকার আহ আমি জানতাম না যে "নকল" প্রিডিকেট: ((এখন কী, আমি আমার উত্তরটি মুছে ফেলব বা পরিবর্তে কেবল আপনার দেখানোর জন্য এটি পরিবর্তন করব?
üzgür

@ বেনবোলকার, আপনার সমাধানটি ভুল; শুধু চেষ্টা করুন: full_vector = c(1,1,1,2,3); searched_vector = c(1,1,3);- যা 1, 1, 2সঠিক উত্তরের পরিবর্তে উত্পাদন করে 1, 2
এফএনএল

কেবলমাত্র পুনরাবৃত্তি মানগুলির জন্য একটি সম্ভাব্য, সঠিক সমাধান যুক্ত করতে:removeif <- function(from, where) { for (i in where) if (i %in% from) {from = from[-match(i, from)]}; from}
ফেনল

1
q <- c(1,1,2,2,3,3,3,4,4,5,5,7,7)
rm <- q[11]
remove(rm)
q
q[13] = NaN
q
q %in% 7

এটি ভেক্টরে ১৩ টিকে একটি সংখ্যা নয় (এনএএন) তে সেট করে এটি এটি মিথ্যা অপসারণ (q [c (11,12,13)] দেখায় যদি আপনি এটি চেষ্টা করেন তবে আপনি দেখতে পাবেন যে অপসারণ ফাংশন ভেক্টর সংখ্যায় কাজ করে না। আপনি পুরো ভেক্টর সরিয়ে ফেলেন তবে সম্ভবত একটি উপাদানও নয়।


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