2012-06-14 13 views
23

मेरे पास आर 0 में data.frame है जिसमें 1 9 मिलियन पंक्तियां और 9 0 कॉलम हैं। मेरे पास बहुत सी अतिरिक्त रैम और सीपीयू चक्र हैं। ऐसा लगता है कि इस डेटा फ्रेम में एक एकल स्तंभ का नाम भी बदलकर आरकॉलम नाम बदलने से बड़े डेटा के साथ बहुत लंबा समय लगता है। फ्रेम?

system.time(colnames(my.df)[1] <- "foo") 
    user system elapsed 
356.88 16.54 373.39 

के लिए एक बहुत ही गहन ऑपरेशन है क्यों यह इतना है? क्या हर पंक्ति कॉलम नाम को किसी भी तरह स्टोर करती है? क्या यह एक पूरी तरह से नया डेटा फ्रेम बना रहा है? ऐसा लगता है कि यह ऑपरेशन नगण्य समय में पूरा होना चाहिए। मुझे R manual entry में कुछ भी स्पष्ट दिखाई नहीं देता है।

मैं विंडोज 7 पर 7600 आर (64 बिट) का निर्माण कर रहा हूं, और मेरे वर्तमान वर्कस्पेस में, छोटे डेटा पर कॉलनाम सेट कर रहा हूं। फ्रेम system.time() के अनुसार '0' समय लेता है।

संपादित करें: मुझे data.table का उपयोग करने की संभावना से अवगत है, और ईमानदारी से, मैं नाम बदलने के लिए 5 मिनट का इंतजार कर सकता हूं, जबकि मुझे कुछ चाय मिलती है। मुझे क्या दिलचस्पी है क्या हो रहा है और क्यों?

+0

विचित्र रूप से, मैं बस इसके बारे में पढ़ रहा था। मुझे विश्वास है कि यह वास्तव में df _twice_ की प्रतिलिपि बना सकता है। यदि आप 2.15.0 का उपयोग कर रहे हैं, तो पैकेज ** डेटाफ्रेम ** को स्थापित करने और लोड करने का प्रयास करें और देखें कि इससे कोई मदद मिलती है या नहीं। – joran

+5

मैथ्यू डॉउल ने यह बहुत अच्छी तरह से बताया [यहां] (http://stackoverflow.com/questions/10655438/rename-one-named-column-in-r/10655997#10655997) और 'data.table' पैकेज के साथ समाधान प्रदान करता है । – Chase

+0

धन्यवाद, मैं पहले से ही 'data.table' का उपयोग करता हूं (और मुझे चिपचिपा परिस्थितियों से बाहर निकालने के लिए मैथ्यू डॉउल का ऋणी हूं!) - यहां मैं क्या हो रहा है इसके बारे में स्पष्टीकरण के बाद था ... और आदर्श रूप से क्यों। क्या जवाब वास्तव में सिर्फ "डेटा.फ्रेम बुरी तरह कोडित है"? – Ina

उत्तर

21

के रूप में कई टिप्पणीकर्ताओं का उल्लेख किया है, डेटा फ्रेम कॉलम का नाम बदलने, धीमी है क्योंकि (तुम कैसे करते के आधार पर) 1 और 4 के बीच पूरे data.frame की प्रतियां बनाता है।

DF = data.frame(a=1:2,b=3:4)  # base data.frame to demo copies 
try(tracemem(DF))     # try() for non-Windows where R is 
            # faster without memory profiling 
colnames(DF)[1] <- "A"    # 4 copies of entire object 
names(DF)[1] <- "A"    # 3 copies of entire object 
names(DF) <- c("A", "b")   # 1 copy of entire object 
`names<-`(DF,c("A","b"))   # 1 copy of entire object 
x=`names<-`(DF,c("A","b"))   # still 1 copy (so not print method) 
# What if DF is large, say 10GB in RAM. Copy 10GB just to change a column name? 

करने के लिए (शुरू) को समझने क्यों बातें इस तरह से किया जाता है, तो आप शायद आवश्यकता होगी: यहाँ, data.table के ?setkey मदद पृष्ठ से, देखा है कि मैं इस व्यवहार को प्रदर्शित करने का सबसे अच्छा तरीका है आर-डेवेल पर संबंधित कुछ चर्चाओं में शामिल होने के लिए। R-devel: speeding up perception और R-devel: Confused about NAMES

उन धागे की मेरे इम्प्रेशनिस्टिक पढ़ने कि है: इतना है कि यह करने के लिए संशोधन कर सकते हैं मूल अधिलेखन से पहले 'बाहर की कोशिश की' जा

  1. कम से कम एक प्रति किया जाता है यहां पर कुछ कर रहे हैं। इस प्रकार, यदि मूल्य-से-पुन: असाइन किए गए कुछ के साथ कुछ गलत है, [<-.data.frame या names<- मूल वस्तु को कोई नुकसान किए बिना 'बैक आउट' कर सकता है और त्रुटि संदेश दे सकता है।

  2. आर-कोर के कई सदस्य पूरी तरह से संतुष्ट नहीं हैं कि चीजें अभी कैसे काम कर रही हैं। कई लोगों ने समझाया कि कुछ मामलों में "आर ट्रैक खो देता है"; ल्यूक तिएर्नी इंगित करता है कि उसने अतीत में इस प्रतिलिपि से संबंधित कुछ संशोधनों की कोशिश की है "कुछ मामलों में और हमेशा पीछे हटना पड़ा"; और साइमन Urbanek संकेत "कुछ बातें भी आ रहा हो सकता है" कि

(जैसा कि मैंने कहा, हालांकि, कि सिर्फ इम्प्रेशनिस्टिक है: मैं बस आर के के विवरण के बारे में पूरी बातचीत का पालन करने में सक्षम नहीं कर रहा हूँ आंतरिक)


भी प्रासंगिक, मामले में आप इसे नहीं देखा है, तो यहां आपको names(z)[3] <- "c2" की तरह कुछ "वास्तव में" काम करता है:!

# From ?names<- 
z <- "names<-"(z, "[<-"(names(z), 3, "c2")) 

नोट: इनमें से अधिकतर उत्तर मैथ्यू डॉउले के जवाब this other question से आता है। (मैंने सोचा कि यह इसे यहां रखने लायक था, और इसे कुछ और जोखिम प्रदान करना, क्योंकि यह आपके अपने प्रश्न के लिए बहुत प्रासंगिक है)।

+1

++, मुझे उन बातचीत के आस-पास अपने सिर को लपेटने में कठिनाई हो रही थी। – Ina

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