2013-04-22 9 views
5

में संदर्भ द्वारा असाइनमेंट पर ऑप्टिमाइज़ेशन संदेशों को समझना यह @sds here से इस प्रश्न का उत्तर देने के दौरान एक अवलोकन से है। अब,डेटाटेबल

options(datatable.verbose = TRUE) 
dt <- data.table(a = c(rep(3, 5), rep(4, 5)), b=1:10, c=11:20, d=21:30, key="a") 

लगता है एक स्तंभ a के आधार पर वर्गीकृत सभी कॉलम का कुल योग प्राप्त करना चाहता है, तो, हम कर सकता है::

सबसे पहले, मुझे ट्रेस संदेशों पर स्विच data.table के लिए जाने

dt.out <- dt[, lapply(.SD, sum), by = a] 

अब, मान लीजिए कि मैं प्रत्येक समूह से संबंधित प्रविष्टियों की संख्या dt.out पर जोड़ना चाहता हूं, तो मैं इसे सामान्य रूप से संदर्भ के अनुसार निर्दिष्ट करता हूं:

dt.out[, count := dt[, .N, by=a][, N]] 
# or alternatively 
dt.out[, count := dt[, .N, by=a][["N"]]] 

इस असाइनमेंट में संदर्भ द्वारा, संदेशों data.table पैदा करता है में से एक है:

RHS for item 1 has been duplicated. Either NAMED vector or recycled list RHS. 

यह data.table के स्रोत निर्देशिका assign.C में एक फ़ाइल से एक संदेश है। मैं यहां प्रासंगिक स्निपेट पेस्ट नहीं करना चाहता क्योंकि यह लगभग 18 लाइनें है। यदि आवश्यक हो, तो बस एक टिप्पणी छोड़ दो और मैं कोड पेस्ट कर दूंगा। dt[, .N, by=a][["N"]] बस [1] 5 5 देता है। तो, यह named vector है। और मैं समझता हूँ कि नहीं क्या आरएचएस में इस recycled list है ..

लेकिन अगर मैं कार्य करें:

dt.out[, `:=`(count = dt[, .N, by=a][, N])] 
# or equivalently 
dt.out[, `:=`(count = dt[, .N, by=a][["N"]])] 

फिर, मैं संदेश मिलता है:

Direct plonk of unnamed RHS, no copy. 

मैं इस को समझने के रूप में पहले मामले में आरएचएस डुप्लिकेट रहा है, जिसका अर्थ है कि यह एक प्रतिलिपि बना रहा है (उथला/गहरा, यह मुझे नहीं पता)। यदि हां, तो यह क्यों हो रहा है?

भले ही नहीं, आंतरिक रूप से दो के बीच संदर्भ द्वारा असाइनमेंट में परिवर्तन क्यों? कोई विचार?

मुख्य अंतर्निहित सवाल है कि मैं अपने मन में था, जबकि इस पोस्ट लिख बाहर लाने के लिए (और भूल गए लगते हैं!): dt.out[, count := dt[, .N, by=a][["N"]]] (ऐसा करने का दूसरा तरीका की तुलना में आवंटित करने के लिए यह "कम कुशल" है यह)?

+0

उत्तर देने में खुशी है लेकिन एसओ में क्या प्रश्न हैं। समझ? मैं अब के लिए पहले भाग का जवाब दूंगा ... –

+0

मैं यह सुनिश्चित करने के लिए प्रश्न संपादित करूंगा कि मेरा प्रश्न है, यहां के अलावा, यह * अक्षम है * 'a: = .' का उपयोग करके असाइन करने के लिए। – Arun

+1

शीर्ष पर मुझे काफी यकीन है कि यह 'विकल्प (डेटाटेबल.वरबोज = TRUE) होना चाहिए। 'Datatable.warnings' विकल्प नहीं है लेकिन कुछ भी शिकायत नहीं करेगा कि यह सेटिंग अप्रभावी थी। –

उत्तर

6

अद्यतन: अभिव्यक्ति,

DT[, c(..., lapply(.SD, .), ..., by=.] 

अनुकूलित किया गया है आंतरिक रूप में प्रतिबद्ध v1.9.3 (FR #2722) की # 1242।

ओ प्रपत्र DT[, c(..., lapply(.SD, fun)), by=grp] के परिसर j-भाव अब अनुकूलित कर रहे हैं, जब तक .SD रूप lapply(.SD, fun) में ही मौजूद है के रूप में: यहाँ NEWS से प्रविष्टि है।

पूर्व के लिए: DT[, list(.I, x=sum(x), y=sum(y), ..., mean(x), log(x), log(y), ...), by=grp]

लेकिन DT[, c(.SD, lapply(.SD, sum)), by=grp] उदाहरण के लिए अभी तक अनुकूल नहीं है: DT[, c(.I, lapply(.SD, sum), mean(x), lapply(.SD, log)), by=grp]
लिए अनुकूलित है। यह आंशिक रूप से FR #2722 हल करता है। एफआर दाखिल करने के लिए सैम स्टीनॉल्ड के लिए धन्यवाद।


यह कहाँ का कहना है NAMED vector इसका मतलब है कि सी स्तर पर आंतरिक आर अर्थों में; यानी, क्या किसी वस्तु को प्रतीक दिया गया है और उसे कुछ कहा जाता है, भले ही परमाणु वेक्टर में "names" विशेषता हो या नहीं। SEXP संरचना में NAMED मान मान 0, 1 या 2 लेता है। आर इसका उपयोग यह जानने के लिए करता है कि इसे प्रतिलिपि बनाने की आवश्यकता है या नहीं। आर-इन्ट्स की धारा 1.1.2 देखें।

क्या बेहतर होगा अगर data.table में j के अनुकूलन को संभाल सकता:

DT[, c(lapply(.SD,sum),.N), by=a] 

काम करता है कि लेकिन धीमी गति से हो सकता है। वर्तमान में केवल सरल रूप अनुकूलित है:

DT[, lapply(.SD,sum), by=a] 

मुख्य सवाल का जवाब करने के लिए, हाँ निम्नलिखित:

RHS for item 1 has been duplicated. Either NAMED vector or recycled list RHS. 

एक और तरीका है प्राप्त करने के लिए:

Direct plonk of unnamed RHS, no copy. 

की तुलना में वांछनीय है यह है:

dt.out[, count := dt[, .N, by=a]$N] 

मुझे पूरा यकीन नहीं है कि [["N"]]$N की तुलना में NAM(2) देता है जो नहीं करता है।

+0

आपके धैर्य के लिए धन्यवाद मैथ्यू। हां, मैंने पहले ही @ djhurio के उत्तर [** यहां **] बेंचमार्क किया है (http://stackoverflow.com/a/16134117/559784) (उसी पोस्ट में मैंने शीर्ष पर लिंक किया है) और इसे एक छोटा सा धीमा पाया। क्षमा करें, मैंने अभी तक आर-सी एकीकरण के साथ परिचित नहीं किया है। मेरा प्रश्न मूल रूप से संदर्भ द्वारा असाइन करने के दो तरीकों के बीच है: क्या प्रत्येक मामले में अलग-अलग संदेशों में दक्षता के साथ कुछ भी करना है (भले ही मैं समझता हूं कि उत्तर पढ़ने के खंड 1.1.2 के साथ बहुत कुछ करना है)? – Arun

+0

धन्यवाद मैथ्यू। वास्तव में यह अच्छा होगा अगर 'डीटी <- डीटी [, सी (लापरवाही (एसएसडी, योग), एन), द्वारा = ए] 'अनुकूलित किया गया था क्योंकि तब मैं पुराने' डीटी 'को तुरंत छोड़ने में सक्षम होगा। – sds

+0

@sds ठीक है। कृपया आप एक फीचर अनुरोध दर्ज कर सकते हैं। धन्यवाद। –