R dplyr: कई कॉलम ड्रॉप करें


96

मेरे पास उस डेटाफ़्रेम में डेटाफ़्रेम और स्तंभों की सूची है जिन्हें मैं ड्रॉप करना चाहता हूं। irisएक उदाहरण के रूप में डेटासेट का उपयोग करते हैं । मैं केवल शेष स्तंभों को छोड़ना Sepal.Lengthऔर Sepal.Widthउनका उपयोग करना चाहूंगा । मैं इस का उपयोग करते हुए करते हैं selectया select_से dplyrपैकेज?

यहाँ मैंने जो अभी तक कोशिश की है:

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

त्रुटि -drop.cols में: अमान्य ऑपरेटर के लिए अमान्य तर्क

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

त्रुटि -drop.cols में: अमान्य ऑपरेटर के लिए अमान्य तर्क

iris %>% select(!drop.cols)

में त्रुटि। ड्रॉप। रंग: अमान्य तर्क प्रकार

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

में त्रुटि। ड्रॉप। रंग: अमान्य तर्क प्रकार

मुझे लगता है कि मुझे कुछ स्पष्ट याद आ रहा है क्योंकि ये एक बहुत उपयोगी ऑपरेशन की तरह लगता है जो पहले से मौजूद होना चाहिए। गितुब पर, किसी ने एक समान मुद्दा पोस्ट किया , और हेडली ने 'नकारात्मक अनुक्रमण' का उपयोग करने के लिए कहा। यही (मुझे लगता है) मैंने कोशिश की है, लेकिन कोई फायदा नहीं हुआ। कोई सुझाव?

जवाबों:


127

Select_vars पर मदद की जाँच करें। इससे आपको कुछ अतिरिक्त विचार मिलते हैं कि इसके साथ कैसे काम किया जाए।

आपके मामले में:

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। किसी भी विचार क्यों यह हो रहा हो सकता है?
नवनीतं संथानम

1
आह, लगता है कि मैं एक गलती कर रहा था। मैं गलती से select_varsइसके बजाय इस्तेमाल किया select। अब यह पूरी तरह से काम करता है!
नवनीतं संथानम

5
हम इनबिल्ट फ़ंक्शंस के बारे में पता लगाने के लिए कहाँ हैं one_of? जब तक मैं कुछ याद नहीं कर रहा हूँ यह पैकेज प्रलेखन ( help(package='dplyr')) में प्रकट नहीं होता है ।
भूगर्भिक

4
@geotheory, वास्तव में one_of प्रलेखित है। देखते हैं help(one_of, package = "dplyr")। कम से कम यह पैकेज संस्करण 0.5.0 में है। लेकिन यह उन ब्लॉगों को पढ़ने में मदद करता है जो हैडली तब पोस्ट करते हैं जब उनके किसी पैकेज में अपडेट होते हैं। और कुछ कार्यों को अन्य कार्यों के अंदर प्रलेखित किया जाता है। दुर्भाग्यवश, सभी दस्तावेज़ों को पढ़ने की आवश्यकता होती है, जो मैं ज्यादातर तब करता हूं जब मैं ऐसा कुछ चाहता हूं जो फ़ंक्शन के साथ तुरंत स्पष्ट या संभव नहीं है।
फिवर

10
धन्यवाद। प्रलेखन के संदर्भ में, आपको इन कार्यों के बारे में कैसे पता चलेगा?
14


37

इसके अलावा select(-one_of(drop.cols))स्तंभों को छोड़ने के लिए कुछ अन्य विकल्प हैं जिनका उपयोग select()करके सभी विशिष्ट स्तंभ नामों को परिभाषित करना शामिल नहीं है (कॉलम नामों में कुछ और विविधता के लिए dplyr starwars नमूना डेटा का उपयोग करके):

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(.))?
जशा

3
इस मामले ~में एनोरोनस फ़ंक्शन को परिभाषित करने के लिए शॉर्टहैंड है, यह नहीं के लिए एक और प्रतीक नहीं है। उदाहरण के लिए इन दोनों एक ही बात मतलब है function(x) {!is.list(x)}और ~!is.list(.)। के ~लिए आशुलिपि के रूप में सोचो function(.)
स्लीफ़ॉक्स

8

select()फ़ंक्शन के साथ सावधान रहें , क्योंकि यह dplyr और MASS पैकेज दोनों में उपयोग किया जाता है, इसलिए यदि MASS लोड किया गया है, तो चयन () ठीक से काम नहीं कर सकता है। यह जानने के लिए कि पैकेज क्या लोड किए गए हैं, टाइप करें sessionInfo()और इसे "अन्य संलग्न पैकेज:" अनुभाग में देखें। यदि यह लोड है, तो टाइप करें detach( "package:MASS", unload = TRUE ), और आपका select()फ़ंक्शन फिर से काम करना चाहिए।


12
वैकल्पिक रूप से आप फ़ंक्शन को पैकेज नेमस्पेस में सीधे एक्सेस कर सकते हैं dplyr::select()
ट्राइमस

2
मैं अक्सर इस समस्या में चला गया हूँ। अब मैं आमतौर पर अपनी स्क्रिप्ट के शीर्ष पर एक नया फ़ंक्शन परिभाषित करता हूं dselect <- dplyr::select()
filups21

5

हम कोशिश कर सकते है

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

धन्यवाद @ वक्र, यह पूरी तरह से काम किया। हालांकि, dplyrबुनियादी विश्लेषण कार्यों को पढ़ने और लिखने में आसान बनाने के लिए आस-पास के प्रचार को देखते हुए , मुझे निराशा है कि वास्तविक समाधान वर्कअराउंड की तरह दिखता है।
नवनीतं संथानम

@NavaneethanSanthanam दरअसल, 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

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