2014-04-03 14 views
38
df <- structure(list(`a a` = 1:3, `a b` = 2:4), .Names = c("a a", "a b" 
), row.names = c(NA, -3L), class = "data.frame") 

युक्त नाम औरdplyr: चयन स्तंभ सफेद स्थान

a a a b 
1 1 2 
2 2 3 
3 3 4 

कॉल के बाद

select(df, 'a a') 

चयन करने के लिए की तरह लग रहा है डेटा

Error in abs(ind[ind < 0]) : 
    non-numeric argument to mathematical function 

मैं चयन कैसे कर सकते हैं देता है " aa "और/या अंतरिक्ष के बिना कुछ करने के लिए इसका नाम बदलें select गाओ? मैं निम्नलिखित दृष्टिकोण पता:

  1. names(df)[1] <- "a"
  2. select(df, a=1)
  3. select(df, ends_with("a"))

लेकिन अगर मैं एक बड़े डेटा सेट पर काम कर रहा हूँ, मैं कैसे एक सटीक मिलान सूचकांक numer जानने के बिना प्राप्त कर सकते हैं या समान कॉलम नाम?

उत्तर

42

बैकटिक्स ` का उपयोग करके आप select वैरिएबल कर सकते हैं।

select(df, `a a`) 
# a a 
# 1 1 
# 2 2 
# 3 3 

हालांकि, यदि आपका मुख्य उद्देश्य स्तंभ नाम बदलने के लिए है, तो आप renameplyr पैकेज में उपयोग कर सकते हैं, जिसमें आप "" और `` दोनों का उपयोग कर सकते हैं।

rename(df, replace = c("a a" = "a")) 
rename(df, replace = c(`a a` = "a")) 

या base आर में:

names(df)[names(df) == "a a"] <- "a" 

विभिन्न उद्धरण के उपयोग पर अधिक विस्तृत रूप से वर्णन के लिए, ?Quotes देखते हैं। 'नाम और पहचानकर्ता' अनुभाग विशेष रूप से यहां प्रासंगिक हैं:

अन्य [वाक्य रचनात्मक रूप से अमान्य] नामों का उपयोग किया जा सकता है बशर्ते उन्हें उद्धृत किया गया हो। वरीय बोली बैकटिक "है।

भी देखें ?make.names वैध नामों के बारे में।

भी देखें this postdplyr

+2

आप भी 'select' साथ भी ऐसा ही कर सकते हैं:' का चयन करें (df, एक = \ 'एक एक \') ' – Arun

+0

@Arun, आपके सुझाव के लिए धन्यवाद। लेकिन क्या यह दोनों "ए" का नाम नहीं बदलते हैं, _and_ केवल इस चर का चयन करें ('नाम बदलें' के विपरीत)? – Henrik

+0

हेनरिक, आप सही हैं। लेकिन 'नाम बदलें' कॉलम का नाम बदलने के लिए पूरे डेटा.फ्रेम की प्रतिलिपि बनायेगा। तो, मैं इसका उपयोग नहीं करता/इसे कुशल मानता हूं। मुझे यकीन नहीं है कि 'data.table' में 'setattr' जैसा कोई तरीका है या नहीं। पूर्व: 'सेटैटर (डीएफ,' नाम ', सी ("ए", "बी")) संदर्भ द्वारा यहां नाम बदलता है। – Arun

0

में बैकटिक करने के लिए कुछ विकल्प का नाम बदलने के बारे में, dplyr 0.5.0, के रूप में अच्छा इस लेखन के रूप में वर्तमान संस्करण।

आप प्रोग्राम एक स्तंभ के रूप में एक बहस का चयन करने की कोशिश कर रहे हैं और आप का नाम बदलें या paste/sprintf स्तंभ नाम की तरह कुछ करने के लिए नहीं करना चाहते हैं बैकटिक में, आप select की non-standard evaluation संस्करण है, जो select_ है के साथ संयोजन के रूप में उपयोग कर सकते हैं as.name:

dplyr कार्यों का
dplyr::select_(df, as.name("a a")) 

कई गैर मानक संस्करण है। विशेष रूप से select के मामले में, आप चुनिंदा सहायक one_of के संयोजन के साथ मानक संस्करण का भी उपयोग कर सकते हैं।प्रलेखन के लिए ?dplyr::select_helpers देखें:

dplyr::select(df, dplyr::one_of("a a")) 
+0

यह गलत है। यहां तक ​​कि dplyr का एनएसई संस्करण इसे संभाल नहीं करता है। उदाहरण के लिए: 'उपनाम (mtcars) [1] <- "मील प्रति गैलन" ' ' mtcars%>% चयन _ ("गैल्स प्रति गैलन") ' यह एक त्रुटि लौटाएगा। – krthkskmr

+1

'mtcars%>% select_ (as.name (" गैल्स प्रति गैलन ")) 'काम करता है। – Andy

संबंधित मुद्दे