2012-03-05 9 views
9

कॉपी किए बिना ही उप सेट चुनने वहाँ एक प्रति चयनित डेटा की किए बिना वस्तुओं (डेटा फ्रेम, मैट्रिक्स, वैक्टर) से एक सबसेट चयन करने के लिए एक तरीका है?आर:

मैं काफी बड़े डेटा सेट के साथ काम करता हूं, लेकिन उन्हें कभी नहीं बदलता। हालांकि अक्सर सुविधा के लिए मैं संचालित करने के लिए डेटा के सबसेट का चयन करता हूं। प्रत्येक बार एक बड़े सबसेट की प्रतिलिपि बनाना बहुत यादगार होता है, लेकिन सामान्य इंडेक्सिंग और subset (और इस प्रकार xapply() फ़ंक्शंस फ़ंक्शन) चयनित डेटा की प्रतियां बनाते हैं। इसलिए मैं ऐसे कार्यों या डेटा संरचनाओं की तलाश में हूं जो इस मुद्दे को दूर कर सकते हैं।

कुछ संभव दृष्टिकोण है कि मेरी जरूरतों और उम्मीद है कि फिट हो सकता कुछ आर संकुल में लागू किया जाता है:

  • तंत्र, यानी डेटा संरचनाओं कि केवल कॉपी कर रहे हैं कॉपी-ऑन-लिखना जब आप जोड़ने या मौजूदा तत्वों को फिर से लिखने ;
  • अपरिवर्तनीय डेटा संरचनाएं, केवल डेटा संरचना के लिए अनुक्रमित जानकारी को पुनर्निर्मित करने की आवश्यकता है, लेकिन इसकी सामग्री नहीं (जैसे स्ट्रिंग से सबस्ट्रिंग को केवल छोटे ऑब्जेक्ट बनाने के लिए जो लंबाई और एक ही चार सरणी में पॉइंटर बनाता है);
  • xapply() ऐसे समूह जो सबसेट नहीं बनाते हैं।
+0

मुझे लगता है कि आपको 'data.table' पैकेज को देखना चाहिए (कोई आपको अधिक जानकारी देने के लिए जल्द ही यहां दिखाएगा ...) –

+0

डेटाबेस इंटरफेस स्पष्ट रूप से जांच कर रहे हैं कि आपको क्या जांच करनी चाहिए। आर में बहुत अधिक चीज पास-दर-वादा है जो इस समय प्रभावी रूप से पास-दर-मूल्य बन जाती है, सब कुछ सबसेट में करने की ज़रूरत होती है। –

+0

@ बेनबॉल्कर: धन्यवाद, 'data.table' अच्छा पैकेज प्रतीत होता है, लेकिन दुर्भाग्यवश यह ज्यादातर मामलों में मेरी आवश्यकताओं के अनुरूप नहीं है। विशेष रूप से, 'data.table' का एक और इंडेक्सिंग मॉडल होता है और' डेटा [1:50, 1:10] '(यानि दोनों पंक्ति और कॉलम द्वारा चयन) और कई रैखिक जैसे चयन करने के लिए इसे अधिक कठिन (और धीमा) बनाता है बीजगणित संचालन।मैं अंतरिक्ष और समय दोनों को बचाने के लिए अपने डेटा फ्रेम के बजाय मैट्रिक्स का उपयोग करने के बारे में सोच रहा था, लेकिन मैट्रिस की सीमाएं भी हैं, इसलिए मैं वैकल्पिक विकल्पों की भी तलाश कर रहा हूं। – ffriend

उत्तर

5

पैकेज ref पैकेज का प्रयास करें। विशेष रूप से, इसकी refdata कक्षा।

data.table के बारे में आप क्या खो सकते हैं यह है कि जब समूह (by= पैरामीटर) डेटा के सबसेट कॉपी नहीं किए जाते हैं, तो यह तेज़ है। [ठीक है तकनीकी रूप से वे कर रहे हैं, लेकिन स्मृति का एक साझा क्षेत्र है जिसमें प्रत्येक समूह के लिए पुन: उपयोग किया जाता है, और की नकल की memcpy जो आर की तुलना में बहुत तेजी से सी में छोरों के लिए है का उपयोग करते हुए]

data.table में := एक तरह से एक data.table संशोधित करने के लिए है जगह। data.table सामान्य आर प्रोग्रामिंग शैली से निकलता है जिसमें यह कॉपी-ऑन-राइट नहीं है। प्रयोक्ता को copy() को एक फ़ंक्शन के भीतर भी (संभावित रूप से बहुत बड़ी) तालिका की प्रतिलिपि बनाने के लिए स्पष्ट रूप से कॉल करना होगा।

आप सही हैं कि refdata जैसे कोई तंत्र नहीं है data.table में बनाया गया है। मैं देखता हूं कि आपका क्या मतलब है और यह एक अच्छी सुविधा होगी। refdata को data.table पर काम करना चाहिए, और आप data.frame के साथ ठीक हो सकते हैं (लेकिन tracemem(DF) के साथ प्रतियों की निगरानी करना सुनिश्चित करें)।

पैकेज plyr पैकेज में idata.frame (अपरिवर्तनीय data.frame) भी है।

+0

महान जवाब, धन्यवाद! – ffriend