data.table
कुंजियों और सूचकांकों का उपयोग करना
खोज…
परिचय
टिप्पणियों
आधिकारिक विगनेट्स इस विषय का सबसे अच्छा परिचय हैं:
कुंजी बनाम सूचकांक
स्तंभों के अनुक्रम के द्वारा डेटाटेबल को "की" किया जा सकता है, रुचि वाले कार्यों को बताते हुए कि डेटा उन स्तंभों द्वारा सॉर्ट किया जाता है। कुंजी प्राप्त या सेट करने के लिए, प्रलेखित फ़ंक्शंस का उपयोग करें ?key
।
इसी तरह, फ़ंक्शन डेटाटेबल के "सूचकांकों" का लाभ उठा सकते हैं। प्रत्येक सूचकांक - और एक तालिका में एक से अधिक हो सकते हैं - स्तंभों के अनुक्रम के संबंध में डेटा के क्रम के बारे में जानकारी संग्रहीत करता है। एक कुंजी की तरह, एक सूचकांक कुछ कार्यों को गति दे सकता है। प्राप्त करने के लिए या सेट सूचकांक, समारोहों में दस्तावेज का उपयोग ?indices
।
संकेत भी स्वचालित रूप से सेट किए जा सकते हैं (वर्तमान में केवल एक समय में एक कॉलम के लिए)। देखें ?datatable.optimize
यह कैसे काम करता है और कैसे यदि आवश्यक हो तो उसे निष्क्रिय करने पर जानकारी के लिए।
सत्यापन और अद्यतन
कुंजी कॉलम में गुम मानों की अनुमति है।
कुंजी और सूचकांक को विशेषताओं के रूप में संग्रहीत किया जाता है और दुर्घटना से, तालिका में डेटा के वास्तविक क्रम के अनुरूप नहीं हो सकता है। कई फ़ंक्शन उपयोग करने से पहले कुंजी या इंडेक्स की वैधता की जांच करते हैं, लेकिन यह ध्यान में रखने योग्य है।
कुंजी और सूचकांक अपडेट के बाद हटा दिए जाते हैं जहां यह स्पष्ट नहीं है कि क्रम क्रम संरक्षित है। उदाहरण के लिए, DT = data.table(a=c(1,2,4), key="a")
से शुरू होकर, यदि हम DT[2, a := 3]
जैसे अपडेट करते हैं, तो कुंजी टूट जाती है।
सबसेट का चयन करने के लिए प्रदर्शन में सुधार
# example data
set.seed(1)
n = 1e7
ng = 1e4
DT = data.table(
g1 = sample(ng, n, replace=TRUE),
g2 = sample(ng, n, replace=TRUE),
v = rnorm(n)
)
एक कॉलम पर मिलान
%in%
==
या %in%
साथ सबसेट ऑपरेशन के पहले रन के बाद ...
system.time(
DT[ g1 %in% 1:100]
)
# user system elapsed
# 0.12 0.03 0.16
g1
लिए एक इंडेक्स स्वचालित रूप से बनाया गया है। बाद के सबसिमेटिंग ऑपरेशन लगभग तुरंत चलते हैं:
system.time(
DT[ g1 %in% 1:100]
)
# user system elapsed
# 0 0 0
जब कोई इंडेक्स बनाया या उपयोग किया जाता है, तो मॉनिटर करने के लिए, verbose=TRUE
विकल्प जोड़ें या ग्लोबल सेटिंग options(datatable.verbose=TRUE)
बदलें।
कई कॉलम पर मिलान
वर्तमान में, दो कॉलमों का मिलान स्वचालित रूप से एक इंडेक्स नहीं बनाता है:
system.time(
DT[ g1 %in% 1:100 & g2 %in% 1:100]
)
# user system elapsed
# 0.57 0.00 0.57
इसे फिर से चलाएं और यह धीमा रहेगा। यहां तक कि अगर हम मैन्युअल रूप से setindex(DT, g1, g2)
साथ सूचकांक जोड़ते हैं, तो यह धीमा रहेगा क्योंकि यह क्वेरी अभी तक पैकेज द्वारा अनुकूलित नहीं है।
सौभाग्य से, अगर हम उन मूल्यों के संयोजन की गणना कर सकते हैं जिन्हें हम खोजना चाहते हैं और एक सूचकांक उपलब्ध है, तो हम जल्दी से समान-जुड़ सकते हैं:
system.time(
DT[ CJ(g1 = 1:100, g2 = 1:100, unique=TRUE), on=.(g1, g2), nomatch=0]
)
# user system elapsed
# 0.53 0.00 0.54
setindex(DT, g1, g2)
system.time(
DT[ CJ(g1 = 1:100, g2 = 1:100, unique=TRUE), on=.(g1, g2), nomatch=0]
)
# user system elapsed
# 0 0 0
CJ
साथ, संयोजनों की संख्या के लिए बाहर देखना बहुत महत्वपूर्ण है।