setkey
करना महंगा होगा (भले ही आप 1.8.11
में तेज़ क्रम का उपयोग करना चाहते थे), क्योंकि इसे डेटा (संदर्भ द्वारा) को भी स्थानांतरित करना है।
हालांकि, आप floor
फ़ंक्शन का उपयोग करके इस मामले को प्राप्त कर सकते हैं। असल में, यदि आप सभी संख्याओं को [1,2] (नोट: यहां 1 और 2 सहित) चाहते हैं, तो floor
इन सभी मानों के लिए "1" का मान प्रदान करेगा। यही कारण है, आप कर सकते हैं:
system.time(t1 <- dt[floor(a) == 1])
# user system elapsed
# 0.234 0.001 0.238
यह dt[a >= 1 & a <=2]
कर के बराबर दोगुनी गति से है और कर रहा है।
system.time(t2 <- dt[a >= 1 & a <= 2])
# user system elapsed
# 0.518 0.081 0.601
identical(t1,t2) # [1] TRUE
हालांकि, चूंकि आपने समानता नहीं करना चाहते, तो आप एक हैक स्तंभ a
से सहिष्णुता = .Machine$double.eps^0.5
घटाना करने के लिए उपयोग कर सकते हैं। यदि मान [1, 1+tolerance)
श्रेणी में है, तो यह अभी भी 1 माना जाता है। और यदि यह और अधिक है, तो यह अब 1 (आंतरिक रूप से) नहीं है। यही है, यह सबसे छोटी संख्या> 1 है जिसे मशीन 1 के रूप में पहचाना जा सकता है। इसलिए, यदि आप सहिष्णुता द्वारा 'ए' घटाते हैं तो आंतरिक रूप से "1" के रूप में प्रतिनिधित्व की जाने वाली सभी संख्याएं < 1 और floor(.)
परिणामस्वरूप 0 हो जाएंगी। , आपको इसके बजाय श्रेणी> 1 और < 2 मिल जाएगी। यही कारण है कि
dt[floor(a-.Machine$double.eps^0.5)==1]
dt[a>1 & a<2]
के रूप में बराबर परिणाम दे देंगे, है।
आप मदद कर सकता है तो शायद उस integer
स्तंभ पर इस floor
समारोह के साथ एक नया स्तंभ और सेटिंग कुंजी बनाने बार-बार ऐसा करने के लिए, कर दिया है तो:
dt[, fa := as.integer(floor(a-.Machine$double.eps^0.5))]
system.time(setkey(dt, fa)) # v1.8.11
# user system elapsed
# 0.852 0.158 1.043
अब, आप जो कुछ भी सीमा क्वेरी कर सकता है आप द्विआधारी खोज का उपयोग करना चाहते हैं:
> system.time(dt[J(1L)]) # equivalent to > 1 & < 2
# user system elapsed
# 0.071 0.002 0.076
> system.time(dt[J(1:4)]) # equivalent to > 1 & < 5
# user system elapsed
# 0.082 0.002 0.085
'बीच 'किसी भी समय सहेज नहीं पाएगा क्योंकि इसमें कोड' x> = निचला और x <= upper' है। 'dt [a> 1 और a <2]' उतनी तेज होगी जितनी तेजी से –
एक कुंजी सेट करने के बारे में कैसे? मैंने अभी अपना प्रश्न अपडेट नहीं किया है, यह सुनिश्चित नहीं है कि मैं एक कुंजी पर एक विस्तृत खोज कर सकता हूं। – Abhi