data.table
ऑब्जेक्ट में अब एक: = ऑपरेटर है। यह ऑपरेटर अन्य सभी असाइनमेंट ऑपरेटरों से अलग क्या बनाता है? इसके अलावा, इसके उपयोग क्या हैं, यह कितना तेज है, और इसे कब टाला जाना चाहिए?
data.table
ऑब्जेक्ट में अब एक: = ऑपरेटर है। यह ऑपरेटर अन्य सभी असाइनमेंट ऑपरेटरों से अलग क्या बनाता है? इसके अलावा, इसके उपयोग क्या हैं, यह कितना तेज है, और इसे कब टाला जाना चाहिए?
जवाबों:
यहां एक उदाहरण दिखाया गया है, जो 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
set(DT, i, "V1", i)
सेट "V1"
जबकि स्तंभ set(DT, i, colVar, i)
सेट स्तंभ नाम में निहित colVar
चर (जैसे अगर colVar = "V1"
पहले किया गया था)। उद्धरण चर को खोजने के बजाय कॉलम नाम को शाब्दिक रूप से लेने का संकेत देते हैं।