यह data.table R ट्यूटोरियल DT[i, j, by] कमांड की बुनियादी बातें समझाता है, जो data.table पैकेज का कोर है। यदि आप data.table पैकेज के बारे में और सीखना चाहते हैं, तो DataCamp data.table पैकेज पर एक इंटरैक्टिव R कोर्स प्रदान करता है। इस कोर्स में 35 से अधिक इंटरैक्टिव R अभ्यास हैं—जो सभी आपके ब्राउज़र में ही होते हैं—और कई वीडियो हैं जिनमें Matt Dowle, data.table पैकेज के मुख्य लेखक, और Arun Srinivasan, प्रमुख योगदानकर्ता, शामिल हैं। इसे मुफ़्त में आज़माएँ।
यदि आपने पहले से RAM में बड़े डेटासेट्स (1 से 100GB से अधिक) के साथ काम किया है, तो आप जानते होंगे कि data.frame सीमित हो सकता है: कुछ कामों में बहुत समय लगता है। Data.table इसे कंप्यूटिंग समय घटाकर हल करता है। इससे भी बढ़कर, यह कम टाइपिंग में ज़्यादा करने में मदद करता है। जब आप इस data.table R ट्यूटोरियल से data.table का सिंटैक्स सीख लेते हैं, तो जटिल कार्यों को सरलता से करना आपको चकित कर देगा। यानी आप केवल कंप्यूटिंग समय ही नहीं, प्रोग्रामिंग समय भी बचाएँगे।
DT[i,j,by] कमांड के तीन भाग होते हैं: i, j और by। यदि आप SQL शब्दावली में सोचें, तो i WHERE के अनुरूप है, j SELECT के और by GROUP BY के। हम इस कमांड को इस तरह पढ़ते हैं: “DT लें, पंक्तियों को ‘i’ से सबसेट करें, फिर ‘by’ के अनुसार समूहित करके ‘j’ की गणना करें।” एक सरल उदाहरण में, और hflights डेटासेट का उपयोग करते हुए (ताकि आप सारे उदाहरण दोहरा सकें), यह देता है:
library(hflights)
library(data.table)
DT <- as.data.table(hflights)
DT[Month==10,mean(na.omit(AirTime)), by=UniqueCarrier]संचालित द्वारा
UniqueCarrier V1
AA 68.76471
AS 255.29032
B6 176.93548
CO 141.52861...संचालित द्वारा
जहाँ हमने डेटा टेबल को केवल वर्ष के 10वें महीने की पंक्तियों तक सीमित किया, उन विमानों का औसत AirTime निकाला जो वास्तव में उड़े थे (इसीलिए na.omit() का उपयोग किया गया है; रद्द हुई उड़ानों में AirTime का मान नहीं होता) और फिर परिणामों को उनके Carrier के अनुसार समूहित किया। उदाहरण के लिए, हम देख सकते हैं कि AA (American Airlines) का औसत AirTime, AS (Alaska Airlines) की तुलना में बहुत कम है। क्या आपने यह भी नोटिस किया कि R की बेस फ़ंक्शंस को j भाग में उपयोग किया जा सकता है? हम इस पर आगे आएँगे।
The i Part
‘i’ भाग का उपयोग पंक्तियों को सबसेट करने के लिए होता है, ठीक उसी तरह जैसे किसी डेटा फ़्रेम में।
#Returns all those rows where the Carrier is American Airlines
Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum TailNum ActualElapsedTime
201111614001500 AA 428 N576AA 60201112714011501 AA 428 N557AA 60201113113521502 AA 428 N541AA 70201114214031513 AA 428 N403AA 70201115314051507 AA 428 N492AA 62---20111227210211333 AA 2234 N3ETAA 13220111228310151329 AA 2234 N3FJAA 13420111229410231335 AA 2234 N3GSAA 13220111230510241334 AA 2234 N3BAAA 13020111231610241343 AA 2234 N3HNAA 139
AirTime ArrDelay DepDelay Origin Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted
40-100 IAH DFW 2247130045-91 IAH DFW 224690048-8-8 IAH DFW 224517003933 IAH DFW 2249220044-35 IAH DFW 2249900---112-121 IAH MIA 96481200112-16-5 IAH MIA 96491300110-103 IAH MIA 964121000110-114 IAH MIA 96491100119-24 IAH MIA 96481200संचालित द्वारा
ध्यान दें कि डेटा टेबल में पंक्तियों का सबसेट बनाते समय आपको कॉमा लगाने की ज़रूरत नहीं है। किसी data.frame में DF[2:5] करने से 2वें से 5वें कॉलम की सभी पंक्तियाँ मिलेंगी। इसके बजाय (जैसा कि यह पढ़ने वाला हर कोई जानता है), हमें DF[2:5,] निर्दिष्ट करना पड़ता है। यह भी नोट करें कि data.table के लिए DT[,2:5] का कोई अर्थ नहीं है, जैसा कि data.table पैकेज के FAQs के पहले प्रश्न में समझाया गया है।
दिलचस्प और उपयोगी: पंक्तियों का सबसेट बनाते समय आप DT[…] कमांड में प्रतीक .N भी उपयोग कर सकते हैं, जो पंक्तियों की संख्या या अंतिम पंक्ति को दर्शाता है। आप इसका उपयोग अंतिम पंक्ति या उससे ऑफ़सेट चुनने के लिए कर सकते हैं।
#Returns the penultimate row of DT
Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum TailNum ActualElapsedTime AirTime
20111262656812 WN 621 N727SW 7664
ArrDelay DepDelay Origin Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted
-13-4 HOU TUL 4533900संचालित द्वारा
The j Part
‘j’ भाग का उपयोग कॉलम चुनने और उनके साथ काम करने के लिए होता है। और काम का अर्थ सचमुच कुछ भी हो सकता है। तरह-तरह के फ़ंक्शंस उपयोग किए जा सकते हैं, जो data.table पैकेज की बड़ी ताकत है।
ध्यान दें कि 'i' भाग खाली छोड़ा गया है, और कोष्ठकों में पहली चीज़ कॉमा है। यह पहले थोड़ा अटपटा लग सकता है। हालांकि, इसका सीधा अर्थ है कि हम किसी भी पंक्ति पर सबसेट नहीं कर रहे हैं, यानी सभी पंक्तियाँ चुनी जाती हैं। 'j' भाग में, सभी उड़ानों पर आगमन के समय औसत देरी की गणना की जाती है। लगता है कि hflights डेटासेट में औसतन विमानों में 7 मिनट से अधिक की देरी थी। अगली उड़ान पकड़ते समय तैयार रहें!
जब 'j' भाग में कई कॉलम चुनकर उन पर काम करना हो, तो आपको ‘.()’ नोटेशन का उपयोग करना होता है। यह नोटेशन वास्तव में ‘list()’ का उपनाम है। यह एक डेटा टेबल लौटाता है, जबकि ‘.()’ न उपयोग करने पर केवल एक वेक्टर लौटता है, जैसा कि ऊपर दिखाया गया है।
DT[, .(mean(na.omit(DepDelay)), mean(na.omit(ArrDelay)))]संचालित द्वारा
DT[, .(Avg_DepDelay = mean(na.omit(DepDelay)),
avg_ArrDelay = mean(na.omit(ArrDelay)))]संचालित द्वारा
Avg_DepDelay Avg_ArrDelay
9.4449517.094334संचालित द्वारा
बेशक, नए कॉलम नाम रखना अनिवार्य नहीं है।
ऊपर ‘i’ और ‘j’ के बारे में जो बताया गया, उसे मिलाकर यह मिलता है:
DT[UniqueCarrier=="AA", .(Avg_DepDelay =
mean(na.omit(DepDelay)),
Avg_ArrDelay = mean(na.omit(ArrDelay)),
plot(DepTime,DepDelay,ylim=c(-15,200)),
abline(h=0))]संचालित द्वारा
Avg_DepDelay Avg_ArrDelay V3 V4
6.3901440.8917558NULLNULLसंचालित द्वारा
यहाँ हमने DT लिया, 'i' भाग में वे सभी पंक्तियाँ चुनीं जहाँ कैरियर AA था, औसत प्रस्थान देरी और आगमन देरी की गणना की, और 'j' भाग में प्रस्थान समय के विरुद्ध प्रस्थान देरी का प्लॉट बनाया।
संक्षेप में, ‘j’ भाग का उपयोग वहीं निर्दिष्ट कॉलम पर गणनाएँ करने के लिए होता है। क्योंकि डेटा टेबल के कॉलम वैरिएबल्स माने जाते हैं, और ‘j’ के हिस्से एक्सप्रेशंस के रूप में इवैल्यूएट होते हैं, ‘j’ भाग में लगभग कुछ भी किया जा सकता है। इससे आपका प्रोग्रामिंग समय काफी कम हो जाता है।
The by part
इस data.table R ट्यूटोरियल का अंतिम खंड ‘by’ भाग पर केंद्रित है। ‘by’ भाग तब उपयोग होता है जब हम किसी विशिष्ट वैरिएबल (या उसके किसी रूपांतरण) के अनुसार समूहित करके ‘j’ भाग की गणना करना चाहते हैं। आप देखेंगे कि प्रत्येक 'by' समूह के लिए ‘j’ एक्सप्रेशन दोहराया जाता है। इसका उपयोग सरल है: आप 'by' आर्गुमेंट में उस कॉलम को निर्दिष्ट कर दें जिसके अनुसार समूह बनाना है।
यहाँ, हमने प्रस्थान से पहले औसत देरी की गणना की, लेकिन उसे विमान के प्रस्थान स्थल के अनुसार समूहित किया। लगता है कि HOU से उड़ने वाली उड़ानों में IAH से उड़ने वालों की तुलना में औसत देरी अधिक है।
'j' भाग की तरह ही, आप 'by' भाग में भी बहुत सा काम कर सकते हैं। 'by' भाग में फ़ंक्शंस का उपयोग किया जा सकता है ताकि ‘j’ भाग में किए गए ऑपरेशन्स के परिणाम DT[…] कमांड के अंदर हमने जो निर्दिष्ट किया है, उसके अनुसार समूहित हों। DT[…] के अंदर फ़ंक्शंस का उपयोग उस एक पंक्ति को बहुत शक्तिशाली बना देता है। इसी तरह, जब 'by' भाग में कई कॉलम उपयोग करने हों, तो ‘.()’ नोटेशन का उपयोग करना होगा।
DT[,.(Avg_DepDelay_byWeekdays = mean(na.omit(DepDelay))), by=.(Origin,Weekdays = DayOfWeek<6)]संचालित द्वारा
यहाँ, पहले सभी विमानों (क्योंकि 'i' भाग में कोई सबसेटिंग नहीं, इसलिए सभी पंक्तियाँ चुनी गईं) के प्रस्थान से पहले औसत देरी की गणना की गई, और फिर समूह बनाए गए—पहले विमान के प्रस्थान स्थल के अनुसार और फिर सप्ताह के दिन के अनुसार। सप्ताहांत में Weekdays का मान False होता है। लगता है कि जब विमान HOU से उड़ा, तो प्रस्थान से पहले औसत देरी IAH की तुलना में अधिक थी, और चौंकाने वाली बात यह है कि सप्ताहांत में देरी कम थी।
सब कुछ मिलाकर, एक सामान्य DT[i,j,by] कमांड यह देता है:
DT[UniqueCarrier=="DL", .(Avg_DepDelay =
mean(na.omit(DepDelay)),
Avg_ArrDelay = mean(na.omit(ArrDelay)),
Compensation = mean(na.omit(ArrDelay - DepDelay))), by = .(Origin, Weekdays = DayOfWeek&lt;6)]संचालित द्वारा
यहाँ Delta Air Lines द्वारा संचालित विमानों के सबसेट (जो 'i' में चुना गया) को उनके प्रस्थान स्थल और Weekdays के अनुसार (जो 'by' में है) समूहित किया गया। हवा में रहते हुए जो समय “कॉम्पेन्सेट” हुआ, उसकी भी गणना की गई (जो 'j' में है)। लगता है कि सप्ताहांत में, चाहे विमान IAH से आया हो या HOU से, हवा में रहते हुए कॉम्पेन्सेट किया गया समय (यानी तेज़ उड़ान भरकर) अधिक है।
data.table पैकेज में जानने को और भी बहुत कुछ है, पर इस पोस्ट ने बुनियादी DT[i,j,by] कमांड को दिखाया है। DataCamp कोर्स पूरे data.table पैकेज को विस्तार से समझाता है। आप अपने ब्राउज़र में अपनी गति से अभ्यास कर सकते हैं, संकेत और फ़ीडबैक पा सकते हैं, और वीडियोज़ व स्लाइड्स जितनी बार चाहें, रिव्यू कर सकते हैं। यह इंटरैक्टिव सीखने का तरीका आपको डेटा टेबल्स के साथ गहन ज्ञान और व्यावहारिक अनुभव देता है। इसे मुफ़्त में आज़माएँ। DataCamp का data.table R पैकेज चीट शीट भी देखें।
उम्मीद है कि इस data.table R ट्यूटोरियल की बदौलत अब आप data.table के मूलभूत सिंटैक्स को समझते हैं और खुद प्रयोग करने के लिए तैयार हैं। यदि data.table पैकेज से संबंधित आपके प्रश्न हैं, तो यहाँ देखें। Matt और Arun बहुत सक्रिय हैं। data.table पैकेज पर अगली ब्लॉगपोस्ट्स में हम और तकनीकी पहलुओं पर बात करेंगे, और डेटा टेबल्स की व्यापक संभावनाओं पर ज़ूम करेंगे। जुड़े रहें!
यह data.table R ट्यूटोरियल
DT[i, j, by]कमांड की बुनियादी बातें समझाता है, जो data.table पैकेज का कोर है। यदि आप data.table पैकेज के बारे में और सीखना चाहते हैं, तो DataCamp data.table पैकेज पर एक इंटरैक्टिव R कोर्स प्रदान करता है। इस कोर्स में 35 से अधिक इंटरैक्टिव R अभ्यास हैं—जो सभी आपके ब्राउज़र में ही होते हैं—और कई वीडियो हैं जिनमें Matt Dowle, data.table पैकेज के मुख्य लेखक, और Arun Srinivasan, प्रमुख योगदानकर्ता, शामिल हैं। इसे मुफ़्त में आज़माएँ।यदि आपने पहले से RAM में बड़े डेटासेट्स (1 से 100GB से अधिक) के साथ काम किया है, तो आप जानते होंगे कि
data.frameसीमित हो सकता है: कुछ कामों में बहुत समय लगता है। Data.table इसे कंप्यूटिंग समय घटाकर हल करता है। इससे भी बढ़कर, यह कम टाइपिंग में ज़्यादा करने में मदद करता है। जब आप इस data.table R ट्यूटोरियल से data.table का सिंटैक्स सीख लेते हैं, तो जटिल कार्यों को सरलता से करना आपको चकित कर देगा। यानी आप केवल कंप्यूटिंग समय ही नहीं, प्रोग्रामिंग समय भी बचाएँगे।DT[i,j,by]कमांड के तीन भाग होते हैं:i,jऔरby। यदि आप SQL शब्दावली में सोचें, तोiWHERE के अनुरूप है,jSELECT के औरbyGROUP BY के। हम इस कमांड को इस तरह पढ़ते हैं: “DT लें, पंक्तियों को ‘i’ से सबसेट करें, फिर ‘by’ के अनुसार समूहित करके ‘j’ की गणना करें।” एक सरल उदाहरण में, औरhflightsडेटासेट का उपयोग करते हुए (ताकि आप सारे उदाहरण दोहरा सकें), यह देता है:जहाँ हमने डेटा टेबल को केवल वर्ष के 10वें महीने की पंक्तियों तक सीमित किया, उन विमानों का औसत AirTime निकाला जो वास्तव में उड़े थे (इसीलिए
na.omit()का उपयोग किया गया है; रद्द हुई उड़ानों में AirTime का मान नहीं होता) और फिर परिणामों को उनके Carrier के अनुसार समूहित किया। उदाहरण के लिए, हम देख सकते हैं कि AA (American Airlines) का औसत AirTime, AS (Alaska Airlines) की तुलना में बहुत कम है। क्या आपने यह भी नोटिस किया कि R की बेस फ़ंक्शंस कोjभाग में उपयोग किया जा सकता है? हम इस पर आगे आएँगे।The i Part
‘i’ भाग का उपयोग पंक्तियों को सबसेट करने के लिए होता है, ठीक उसी तरह जैसे किसी डेटा फ़्रेम में।
पर आप कॉलम नाम भी उपयोग कर सकते हैं, क्योंकि वे DT के स्कोप में इवैल्यूएट होते हैं।
ध्यान दें कि डेटा टेबल में पंक्तियों का सबसेट बनाते समय आपको कॉमा लगाने की ज़रूरत नहीं है। किसी data.frame में
DF[2:5]करने से 2वें से 5वें कॉलम की सभी पंक्तियाँ मिलेंगी। इसके बजाय (जैसा कि यह पढ़ने वाला हर कोई जानता है), हमेंDF[2:5,]निर्दिष्ट करना पड़ता है। यह भी नोट करें कि data.table के लिएDT[,2:5]का कोई अर्थ नहीं है, जैसा कि data.table पैकेज के FAQs के पहले प्रश्न में समझाया गया है।दिलचस्प और उपयोगी: पंक्तियों का सबसेट बनाते समय आप DT[…] कमांड में प्रतीक
.Nभी उपयोग कर सकते हैं, जो पंक्तियों की संख्या या अंतिम पंक्ति को दर्शाता है। आप इसका उपयोग अंतिम पंक्ति या उससे ऑफ़सेट चुनने के लिए कर सकते हैं।The j Part
‘j’ भाग का उपयोग कॉलम चुनने और उनके साथ काम करने के लिए होता है। और काम का अर्थ सचमुच कुछ भी हो सकता है। तरह-तरह के फ़ंक्शंस उपयोग किए जा सकते हैं, जो data.table पैकेज की बड़ी ताकत है।
ध्यान दें कि 'i' भाग खाली छोड़ा गया है, और कोष्ठकों में पहली चीज़ कॉमा है। यह पहले थोड़ा अटपटा लग सकता है। हालांकि, इसका सीधा अर्थ है कि हम किसी भी पंक्ति पर सबसेट नहीं कर रहे हैं, यानी सभी पंक्तियाँ चुनी जाती हैं। 'j' भाग में, सभी उड़ानों पर आगमन के समय औसत देरी की गणना की जाती है। लगता है कि hflights डेटासेट में औसतन विमानों में 7 मिनट से अधिक की देरी थी। अगली उड़ान पकड़ते समय तैयार रहें!
जब 'j' भाग में कई कॉलम चुनकर उन पर काम करना हो, तो आपको ‘
.()’ नोटेशन का उपयोग करना होता है। यह नोटेशन वास्तव में ‘list()’ का उपनाम है। यह एक डेटा टेबल लौटाता है, जबकि ‘.()’ न उपयोग करने पर केवल एक वेक्टर लौटता है, जैसा कि ऊपर दिखाया गया है।एक और उपयोगी फ़ीचर, जिसके लिए ‘
.()’ नोटेशन चाहिए, आपको DT[…] कमांड के अंदर कॉलम का नाम बदलने देता है।बेशक, नए कॉलम नाम रखना अनिवार्य नहीं है।
ऊपर ‘i’ और ‘j’ के बारे में जो बताया गया, उसे मिलाकर यह मिलता है:
यहाँ हमने DT लिया, 'i' भाग में वे सभी पंक्तियाँ चुनीं जहाँ कैरियर AA था, औसत प्रस्थान देरी और आगमन देरी की गणना की, और 'j' भाग में प्रस्थान समय के विरुद्ध प्रस्थान देरी का प्लॉट बनाया।
संक्षेप में, ‘j’ भाग का उपयोग वहीं निर्दिष्ट कॉलम पर गणनाएँ करने के लिए होता है। क्योंकि डेटा टेबल के कॉलम वैरिएबल्स माने जाते हैं, और ‘j’ के हिस्से एक्सप्रेशंस के रूप में इवैल्यूएट होते हैं, ‘j’ भाग में लगभग कुछ भी किया जा सकता है। इससे आपका प्रोग्रामिंग समय काफी कम हो जाता है।
The by part
इस data.table R ट्यूटोरियल का अंतिम खंड ‘by’ भाग पर केंद्रित है। ‘by’ भाग तब उपयोग होता है जब हम किसी विशिष्ट वैरिएबल (या उसके किसी रूपांतरण) के अनुसार समूहित करके ‘j’ भाग की गणना करना चाहते हैं। आप देखेंगे कि प्रत्येक 'by' समूह के लिए ‘j’ एक्सप्रेशन दोहराया जाता है। इसका उपयोग सरल है: आप 'by' आर्गुमेंट में उस कॉलम को निर्दिष्ट कर दें जिसके अनुसार समूह बनाना है।
यहाँ, हमने प्रस्थान से पहले औसत देरी की गणना की, लेकिन उसे विमान के प्रस्थान स्थल के अनुसार समूहित किया। लगता है कि HOU से उड़ने वाली उड़ानों में IAH से उड़ने वालों की तुलना में औसत देरी अधिक है।
'j' भाग की तरह ही, आप 'by' भाग में भी बहुत सा काम कर सकते हैं। 'by' भाग में फ़ंक्शंस का उपयोग किया जा सकता है ताकि ‘j’ भाग में किए गए ऑपरेशन्स के परिणाम DT[…] कमांड के अंदर हमने जो निर्दिष्ट किया है, उसके अनुसार समूहित हों।
DT[…]के अंदर फ़ंक्शंस का उपयोग उस एक पंक्ति को बहुत शक्तिशाली बना देता है। इसी तरह, जब 'by' भाग में कई कॉलम उपयोग करने हों, तो ‘.()’ नोटेशन का उपयोग करना होगा।यहाँ, पहले सभी विमानों (क्योंकि 'i' भाग में कोई सबसेटिंग नहीं, इसलिए सभी पंक्तियाँ चुनी गईं) के प्रस्थान से पहले औसत देरी की गणना की गई, और फिर समूह बनाए गए—पहले विमान के प्रस्थान स्थल के अनुसार और फिर सप्ताह के दिन के अनुसार। सप्ताहांत में Weekdays का मान
Falseहोता है। लगता है कि जब विमान HOU से उड़ा, तो प्रस्थान से पहले औसत देरी IAH की तुलना में अधिक थी, और चौंकाने वाली बात यह है कि सप्ताहांत में देरी कम थी।सब कुछ मिलाकर, एक सामान्य
DT[i,j,by]कमांड यह देता है:यहाँ Delta Air Lines द्वारा संचालित विमानों के सबसेट (जो 'i' में चुना गया) को उनके प्रस्थान स्थल और Weekdays के अनुसार (जो 'by' में है) समूहित किया गया। हवा में रहते हुए जो समय “कॉम्पेन्सेट” हुआ, उसकी भी गणना की गई (जो 'j' में है)। लगता है कि सप्ताहांत में, चाहे विमान IAH से आया हो या HOU से, हवा में रहते हुए कॉम्पेन्सेट किया गया समय (यानी तेज़ उड़ान भरकर) अधिक है।
data.table पैकेज में जानने को और भी बहुत कुछ है, पर इस पोस्ट ने बुनियादी
DT[i,j,by]कमांड को दिखाया है। DataCamp कोर्स पूरे data.table पैकेज को विस्तार से समझाता है। आप अपने ब्राउज़र में अपनी गति से अभ्यास कर सकते हैं, संकेत और फ़ीडबैक पा सकते हैं, और वीडियोज़ व स्लाइड्स जितनी बार चाहें, रिव्यू कर सकते हैं। यह इंटरैक्टिव सीखने का तरीका आपको डेटा टेबल्स के साथ गहन ज्ञान और व्यावहारिक अनुभव देता है। इसे मुफ़्त में आज़माएँ। DataCamp का data.table R पैकेज चीट शीट भी देखें।उम्मीद है कि इस data.table R ट्यूटोरियल की बदौलत अब आप data.table के मूलभूत सिंटैक्स को समझते हैं और खुद प्रयोग करने के लिए तैयार हैं। यदि data.table पैकेज से संबंधित आपके प्रश्न हैं, तो यहाँ देखें। Matt और Arun बहुत सक्रिय हैं। data.table पैकेज पर अगली ब्लॉगपोस्ट्स में हम और तकनीकी पहलुओं पर बात करेंगे, और डेटा टेबल्स की व्यापक संभावनाओं पर ज़ूम करेंगे। जुड़े रहें!