2012-02-14 18 views
29

मैं बड़े डेटा फ्रेम के कुछ यादृच्छिक कॉलम का नाम बदलना चाहता हूं और मैं वर्तमान कॉलम नामों का उपयोग करना चाहता हूं, इंडेक्स नहीं। यदि मैं डेटा में कॉलम जोड़ता या हटाता हूं तो कॉलम इंडेक्स बदल सकता है, इसलिए मुझे मौजूदा कॉलम नामों का उपयोग करना एक अधिक स्थिर समाधान है।नामित कॉलम नाम

mydf = merge(df.1, df.2) 
colnames(mydf)[which(colnames(mydf) == "MyName.1")] = "MyNewName" 

मैं इस कोड को आसान बनाने में कर सकते हैं, या तो मूल merge() कॉल या सिर्फ दूसरी पंक्ति: यह है कि मैं क्या अब है? "MyName.1" वास्तव में दो अलग-अलग xts ऑब्जेक्ट्स के xts merge का परिणाम है।

+0

यदि आप एक छोटे प्रतिलिपि प्रस्तुत करने योग्य डेटा वांछित आउटपुट के साथ सेट प्रदान कर सकते हैं? – Dason

+0

आपको वहां 'कौन सा' की आवश्यकता नहीं है! आर ऑपरेटर में बूलियन स्वीकार करता है []। 'उपनाम (mydf) [colnames (mydf) == "MyName.1"] = "MyNewName" को काम करना चाहिए! –

+1

'नाम (mydf) [नाम (mydf) ==" MyName.1 "] =" MyNewName "' ... लगभग 13 या इतने छोटे अक्षर। हालांकि, आप उस मामले में वेक्टर को प्रतिस्थापित करना चाहते हैं, == के बजाय% में% का उपयोग करें। –

उत्तर

21
names(mydf)[names(mydf) == "MyName.1"] = "MyNewName" # 13 characters shorter. 

हालांकि, आप अंततः एक वेक्टर को प्रतिस्थापित करना चाहते हैं। उस मामले में, == के बजाय %in% का उपयोग करें और MyNewName को

4
names(mydf) <- sub("MyName\\.1", "MyNewName", names(mydf)) 

यदि आप के लिए एक पैटर्न के रूप में एक स्टेम डाल यह एक बहु-नाम-परिवर्तन रणनीति के लिए बेहतर सामान्यीकरण होगा समान लंबाई के एक वेक्टर के रूप MyName.1 सेट sub के बजाय gsub का उपयोग करके प्रतिस्थापित किया जायेगा।

+0

का उपयोग करके धन्यवाद, यह मुझे सही रास्ते पर सेट करता है। अब मैं कर रहा हूं: नाम (डीएफ) [grep ("। 1", नाम (डीएफ))] = सी ("AName.Col1", "AName.Col2", "AName.Col3") –

115

data.frame के कॉलम नाम बदलने के साथ समस्या यह है कि, लगभग अविश्वसनीय रूप से, संपूर्ण data.frame कॉपी किया गया है। यहां तक ​​कि जब यह .GlobalEnv में है और इसमें कोई अन्य चर बिंदु नहीं है।

data.table package में setnames() फ़ंक्शन है जो संपूर्ण डेटासेट की प्रतिलिपि किए बिना संदर्भ द्वारा स्तंभ नाम बदलता है। data.table यह अलग है कि यह कॉपी-ऑन-राइट नहीं करता है, जो बड़े डेटासेट के लिए बहुत महत्वपूर्ण हो सकता है। (आप क्या कहा अपने डेटा सेट बड़ी थी।)

require(data.table) 
setnames(DT,"MyName.1","MyNewName") 
?setnames 
+4

हे। यह 'data.frame' के लिए लगभग कुछ भी करने में एक समस्या है। आपको लगता है कि कारक स्तर बदलना भी जल्दी होगा, लेकिन ऐसा नहीं है। (मुझे यकीन है कि आप सभी लोगों को यह पता है।) –

+0

@DWin। नमस्ते। मुझे लगता है कि 'data.table' में 'setattrib()' संदर्भ द्वारा कॉलम के स्तर को बदल सकता है (' data.frame' में भी)। जाहिर है देखभाल के साथ किया जाना चाहिए। एक नया 'सेटलेवल()' फ़ंक्शन हो सकता है जो एक या कई स्तरों को बदल देगा (उसी इंटरफ़ेस के साथ 'सेटनाम() ')? बीटीडब्ल्यू, ': =' पहले से संदर्भ में नए कारक स्तर जोड़ता है, जो आधार में मुश्किल है। उसके पीछे सी कोड का थोड़ा सा हिस्सा है। –

23

plyr सिर्फ इस उद्देश्य के लिए एक नाम बदलने समारोह है:

library(plyr) 
mydf <- rename(mydf, c("MyName.1" = "MyNewName")) 
+3

यह फ़ंक्शन अब भी 'dplyr' पैकेज में भी शामिल है। –

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