मुझे डेटा में कब: = ऑपरेटर का उपयोग करना चाहिए।


88

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

जवाबों:


94

यहां एक उदाहरण दिखाया गया है, जो 10 मिनट से 1 सेकंड तक कम है ( होमपेज पर NEWS से )। यह सबसाइनिंग जैसा है data.frameलेकिन हर बार पूरी टेबल को कॉपी नहीं करता।

m = matrix(1,nrow=100000,ncol=100)
DF = as.data.frame(m)
DT = as.data.table(m)

system.time(for (i in 1:1000) DF[i,1] <- i)
     user  system elapsed 
  287.062 302.627 591.984 

system.time(for (i in 1:1000) DT[i,V1:=i])
     user  system elapsed 
    1.148   0.000   1.158     ( 511 times faster )

लाना :=में jहै कि अधिक मुहावरे की अनुमति देता है जैसे:

DT["a",done:=TRUE]   # binary search for group 'a' and set a flag
DT[,newcol:=42]      # add a new column by reference (no copy of existing data)
DT[,col:=NULL]       # remove a column by reference

तथा :

DT[,newcol:=sum(v),by=group]  # like a fast transform() by group

मैं बचने का कोई कारण नहीं सोच सकता :=! के अलावा, एक forलूप के अंदर । चूंकि :=अंदर दिखाई देता है DT[...], यह [.data.tableविधि के छोटे ओवरहेड के साथ आता है ; जैसे, S3 प्रेषण और उपस्थिति और जैसे तर्क के प्रकार के लिए जाँच i, by, nomatchअंदर के लिए आदि तो forछोरों, वहाँ एक कम भूमि के ऊपर, के प्रत्यक्ष संस्करण है :=कहा जाता है set?setअधिक विवरण और उदाहरणों के लिए देखें । का नुकसान setशामिल iपंक्ति होना चाहिए संख्या (कोई द्विआधारी खोज) और उसे अपने साथ नहीं जोड़ सकते by। उन प्रतिबंधों setको बनाकर ओवरहेड को नाटकीय रूप से कम कर सकते हैं।

system.time(for (i in 1:1000) set(DT,i,"V1",i))
     user  system elapsed 
    0.016   0.000   0.018

26
इस पैकेज को विकसित करने के लिए धन्यवाद। मुझे लगता है कि मैं इस पैकेज का उपयोग करने के लिए अपने बहुत सारे कोड को संशोधित करने जा रहा हूं ।
Iterator

1
चैट पर मुझे स्वयं पूछने / उत्तर देने के लिए कहा गया था (जो कि स्पष्ट रूप से प्रोत्साहित किया गया है ) - यह सवाल यहाँ है
मैट डॉवेल

4
@MatthewDowle का उपयोग नहीं करने पर: = और सेट () का उपयोग करने के लिए कब का स्पष्टीकरण शामिल करना चाहते हैं?
अरी बी। फ्रीडमैन

2
अगर मैं कर सकता तो @MatthewDowle मैं फिर से +1 करता।
अरी बी। फ्रीडमैन

3
@jabberwocky कोई समस्या नहीं है। set(DT, i, "V1", i)सेट "V1"जबकि स्तंभ set(DT, i, colVar, i)सेट स्तंभ नाम में निहित colVarचर (जैसे अगर colVar = "V1"पहले किया गया था)। उद्धरण चर को खोजने के बजाय कॉलम नाम को शाब्दिक रूप से लेने का संकेत देते हैं।
मैट डाउल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.