2014-10-20 27 views
23

में स्ट्रिंग के रूप में नए कॉलम नाम दर्ज करें dplyr के नामकरण कार्यों को नए कॉलम नाम को अनिवार्य चर नामों के रूप में पारित करने की आवश्यकता होती है। हालांकि मेरे पास एक ऐसा कार्य है जहां कॉलम नाम एक स्ट्रिंग को पारित तर्क पर पेस्ट करके बनाया गया है और इसलिए एक वर्ण स्ट्रिंग है।dplyr के नाम बदलें फ़ंक्शन

उदाहरण के लिए मैं

a new 
1 1 4 
2 2 5 
3 3 6 

जबकि मैं 'नए' स्तंभ नाम होना चाहता हूँ कहते हैं कि यदि मैं यह

df <- data.frame(a = 1:3, old = 4:6) 
myFunc(df, 'x') 

चलाने मैं इस समारोह

myFunc <- function(df, col){ 
    new <- paste0(col, '_1') 
    out <- dplyr::rename(df, new = old) 
    return(out) 
} 

था मैंने जिस स्ट्रिंग का निर्माण किया ('x_1'), यानी

a x_1 
1 1 4 
2 2 5 
3 3 6 

क्या ऐसा करने के लिए वैसे भी है?

+3

[dplyr 0.3' की घोषणा] से [http://blog.rstudio.org/2014/10/13/dplyr-0-3-2/): "अब आप 'dplyr' के साथ प्रोग्राम कर सकते हैं - गैर-मानक मूल्यांकन (एनएसई) का उपयोग करने वाले प्रत्येक कार्य में मानक मूल्यांकन (एसई) जुड़वां भी होता है जो '_' में समाप्त होता है [...] प्रत्येक फ़ंक्शन के एसई संस्करण में समान तर्क होते हैं, लेकिन उन्हें स्पष्ट रूप से" उद्धृत "होना चाहिए। " इस प्रकार, जांचें कि 'rename_' यहां उपयोगी हो सकता है या नहीं। – Henrik

+0

धन्यवाद, यह जानना उपयोगी है लेकिन यह वास्तव में इस मामले में कुछ भी नहीं बदलता है। यह काम करेगा यदि मैं जिस कॉलम में गुजर रहा था वह पुराना कॉलम नाम था, लेकिन उपरोक्त फ़ंक्शन को rename_ (और उद्धरण में पुराना डालने के लिए) का उपयोग करने के लिए अभी भी वही – user1165199

+2

@ user1165199 देता है, मैं 'colnames (df) [colnames (df))% "पुरानी" में%] <- paste0 ("x", "_") '(यदि आवश्यक हो तो फ़ंक्शन में) क्योंकि यह आसानी से नामों के वेक्टर को प्रतिस्थापित करने में सक्षम है। – akrun

उत्तर

21

मुझे लगता है कि यह वही है जो आप खोज रहे थे। यह की rename_ रूप @Henrik सुझाव इस्तेमाल होता है, लेकिन तर्क एक है, मान लीजिए कि, दिलचस्प, नाम:

> myFunc <- function(df, col){ 
+ new <- paste0(col, '_1') 
+ out <- dplyr::rename_(df, .dots=setNames(list(col), new)) 
+ return(out) 
+ } 
> myFunc(data.frame(x=c(1,2,3)), "x") 
    x_1 
1 1 
2 2 
3 3 
> 

नोट setNames के उपयोग सूची में नाम के रूप में नए के मूल्य का उपयोग करने के लिए।

+4

मुझे यकीन है कि नहीं कर रहा हूँ क्या 'सूची (कॉल)' करने की कोशिश कर रहा है। यदि आप बस '.dots = setNames (col, new)' करते हैं, तो आपका उदाहरण अभी भी काम करता है। और यदि आपके पास कई कॉलम हैं जिन्हें आप नाम दे रहे हैं, 'सूची() 'समस्याएं पैदा करेगी क्योंकि' लंबाई (सूची (कोला)) = लंबाई (नया) ' – gregmacfarlane

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