R dplyr: একাধিক কলাম ড্রপ করুন


97

আমার সেই ডাটাফ্রেমে একটি ডেটা ফ্রেম এবং কলামগুলির তালিকা রয়েছে যা আমি ফেলে দিতে চাই। irisউদাহরণস্বরূপ ডেটাসেটটি ব্যবহার করা যাক । আমি বাদ দিতে Sepal.Lengthএবং Sepal.Widthশুধুমাত্র অবশিষ্ট কলামগুলি ব্যবহার করতে চাই । আমি কিভাবে এই ব্যবহার করবেন selectবা select_থেকে dplyrপ্যাকেজ?

আমি এ পর্যন্ত চেষ্টা করেছি এখানে:

drop.cols <- c('Sepal.Length', 'Sepal.Width')
iris %>% select(-drop.cols)

ত্রুটি-বিডিনিউজ কোডগুলিতে: আনারি অপারেটরের পক্ষে অবৈধ যুক্তি

iris %>% select_(.dots = -drop.cols)

ত্রুটি-বিডিনিউজ কোডগুলিতে: আনারি অপারেটরের পক্ষে অবৈধ যুক্তি

iris %>% select(!drop.cols)

ত্রুটি! ড্রপ কলস: অবৈধ যুক্তি প্রকার

iris %>% select_(.dots = !drop.cols)

ত্রুটি! ড্রপ কলস: অবৈধ যুক্তি প্রকার

আমার মনে হচ্ছে আমি সুস্পষ্ট কিছু মিস করছি কারণ এগুলি মনে হয় এমন একটি দুর্দান্ত কার্যকর অপারেশন যা ইতিমধ্যে বিদ্যমান ছিল। গিথুব-তে, কেউ একই ধরণের সমস্যা পোস্ট করেছেন এবং হ্যাডলি 'নেতিবাচক সূচক' ব্যবহার করতে বলেছেন। এটাই (আমার মনে হয়) আমি চেষ্টা করেছি, কিন্তু ফল হয় নি। কোনও পরামর্শ?

উত্তর:


128

সিলেক্ট-ওয়ার্সে সহায়তা পরীক্ষা করুন। এটি আপনাকে কীভাবে এটি নিয়ে কাজ করতে পারে সে সম্পর্কে কিছু অতিরিক্ত ধারণা দেয়।

আপনার ক্ষেত্রে:

iris %>% select(-one_of(drop.cols))

ধন্যবাদ কিছু কারণে, এটি কাজ করে irisতবে আমার আসল ডেটাফ্রেমে নয় ( irisখেলনার উদাহরণ ছিল)। আমার ডেটাফ্রেমে 4558 টি সারি এবং 147 কলাম রয়েছে। আমি পেয়েছি ত্রুটি বার্তা Error in eval(x$expr, data, x$env) : variable names are limited to 10000 bytes। কেন এমন হতে পারে এমন কোনও ধারণা?
নবনিথন সান্থানাম

4
আহ, দেখে মনে হচ্ছে আমি ভুল করছি। আমি দুর্ঘটনাক্রমে select_varsপরিবর্তে ব্যবহার করা select। এখন এটি পুরোপুরি কাজ করে!
নবনিথন সান্থানাম

6
ইনবিল্ট ফাংশনগুলির মতো আমাদের কোথায় পাওয়া উচিত one_of? আমি যদি কিছু মিস করছি তবে প্যাকেজ ডকুমেন্টেশনে এটি প্রদর্শিত হবে না ( help(package='dplyr'))।
ভূগোলিক

4
@ জিওথোরি, আসলে এক_টি নথিভুক্ত। দেখতে help(one_of, package = "dplyr")। কমপক্ষে এটি প্যাকেজ সংস্করণে 0.5.0 হয়। তবে হ্যাডলি পোস্ট করা ব্লগগুলি পড়তে সহায়তা করে যখন তার কোনও প্যাকেজের আপডেট রয়েছে। এবং কিছু ফাংশন অন্যান্য ফাংশন ভিতরে নথিভুক্ত করা হয়। দুর্ভাগ্যক্রমে এর জন্য সমস্ত ডকুমেন্টেশন পড়া দরকার, যা আমি বেশিরভাগ ক্ষেত্রে করি যখন আমি ফাংশনটি দিয়ে তাৎক্ষণিকভাবে সুস্পষ্ট বা সম্ভব না এমন কিছু চাই।
ফাইভার

11
ধন্যবাদ ডকুমেন্টেশনের ক্ষেত্রে আপনি এই স্থানগুলি সম্পর্কে প্রথম স্থানে কীভাবে সন্ধান করবেন?
ভূগোলিক


37

এর বাইরে select(-one_of(drop.cols))কলাম বাদ দেওয়ার জন্য আরও কয়েকটি বিকল্প রয়েছে যা ব্যবহার select()করে নির্দিষ্ট কলামের নাম সংজ্ঞায়িত করা হয় না (কলামের নামগুলিতে আরও বিভিন্ন ধরণের জন্য dplyr স্টারওয়ার নমুনা ডেটা ব্যবহার করে):

starwars %>% 
  select(-(name:mass)) %>%        # the range of columns from 'name' to 'mass'
  select(-contains('color')) %>%  # any column name that contains 'color'
  select(-starts_with('bi')) %>%  # any column name that starts with 'bi'
  select(-ends_with('er')) %>%    # any column name that ends with 'er'
  select(-matches('^f.+s$')) %>%  # any column name matching the regex pattern
  select_if(~!is.list(.)) %>%     # not by column name but by data type
  head(2)

# A tibble: 2 x 2
homeworld species
  <chr>     <chr>  
1 Tatooine  Human  
2 Tatooine  Droid 

কি select_if(~!is.list(.))সমতূল্য select_if(is.list(.))?
জশা

4
এই ক্ষেত্রে ~একটি anonamous ফাংশন সংজ্ঞায়িত জন্য purrr সাধারণভাবে সংক্ষেপে, তাই না জন্য আরেকটি প্রতীক নয়। উদাহরণস্বরূপ এই দুটি অর্থ একই জিনিস function(x) {!is.list(x)}এবং ~!is.list(.)। মনে ~সংক্ষেপে জন্য function(.)
স্লিফক্স

8

select()ফাংশনটি সম্পর্কে সাবধানতা অবলম্বন করুন , কারণ এটি dplyr এবং MASS প্যাকেজ উভয়ই ব্যবহৃত হয়, সুতরাং যদি MASS লোড করা থাকে তবে () নির্বাচন না করে সঠিকভাবে কাজ করবে না। কী প্যাকেজগুলি লোড করা হয়েছে তা জানতে, sessionInfo()"অন্যান্য সংযুক্ত প্যাকেজগুলি:" বিভাগে এটি লিখে টাইপ করুন । যদি এটি লোড হয়, টাইপ করুন detach( "package:MASS", unload = TRUE )এবং আপনার select()ফাংশনটি আবার কাজ করা উচিত।


12
বিকল্পভাবে আপনি সরাসরি প্যাকেজ নেমস্পেসে ফাংশনটি অ্যাক্সেস করতে পারেন dplyr::select()
ট্রায়ামাস

4
আমি এই সমস্যাটি প্রায়শই চালিয়েছি। এখন আমি সাধারণত আমার স্ক্রিপ্টের শীর্ষে একটি নতুন ফাংশন সংজ্ঞায়িত করি dselect <- dplyr::select()
ফাইলআপ 21

5

আমরা চেষ্টা করতে পারি

iris %>% 
      select_(.dots= setdiff(names(.),drop.cols))

ধন্যবাদ @ অ্যাকরুন, এটি পুরোপুরি কার্যকর হয়েছে। তবে, dplyrমৌলিক বিশ্লেষণের কাজগুলি সহজেই পড়তে এবং লিখতে সহজ করার আশেপাশের হাইপকে ঘিরে , আমি হতাশ হয়েছি যে আসল সমাধানটি কার্যক্ষমতার মতো দেখাচ্ছে।
নবনিথন সান্থানাম

@ নবনেথনসন্তানাম আসলে, one_ofঅন্য সমাধানটিই হল উপায়। আমি এটি সম্পর্কে ভুলে গেছি।
আকরুন

3

আরেকটি উপায় হ'ল অযাচিত কলামগুলিকে এতে রূপান্তর করা NULL, এটি এম্বেড করা প্রথম বন্ধনী এড়িয়ে চলে:

head(iris,2) %>% mutate_at(drop.cols, ~NULL)
#   Petal.Length Petal.Width Species
# 1          1.4         0.2  setosa
# 2          1.4         0.2  setosa

এটি কলাম না থাকলে এটি কোনও সতর্কতাও দেয় না।
skoz

3

কলামের নামগুলিতে যদি আপনার একটি বিশেষ চরিত্র থাকে, তবে হয় selectবা select_প্রত্যাশিতভাবে কাজ নাও করতে পারে। dplyrব্যবহারের এই সম্পত্তি "."। প্রশ্নে সেট করা ডেটা উল্লেখ করতে, নিম্নলিখিত সমস্যাটি সমাধান করতে লাইনটি ব্যবহার করা যেতে পারে:

drop.cols <- c('Sepal.Length', 'Sepal.Width')
  iris %>% .[,setdiff(names(.),drop.cols)]

কোড শুধুমাত্র উত্তর নিরুৎসাহিত করা হয়। উত্তরটি কীভাবে কার্যকর হয় এবং এটি ইতিমধ্যে উপস্থিত উত্তরগুলির থেকে কীভাবে পৃথক হয় সে সম্পর্কে কিছু ব্যাখ্যা সরবরাহ করুন।
রাল্ফ স্টুবনার

ধন্যবাদ!! উপরের অন্যান্য সমাধানগুলির কোনওটিই এই সঠিক কারণে কাজ করে নি।
Marty999

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