Last chance! 50% off DataCamp Premium
Sale ends in
यह 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 भाग में उपयोग किया जा सकता है? हम इस पर आगे आएँगे।
‘i’ भाग का उपयोग पंक्तियों को सबसेट करने के लिए होता है, ठीक उसी तरह जैसे किसी डेटा फ़्रेम में।
DT[2:5]
#selects the second to the fifth row of DT
Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum TailNum ActualElapsedTime AirTime
2011 1 2 7 1401 1501 AA 428 N557AA 60 45
2011 1 3 1 1352 1502 AA 428 N541AA 70 48
2011 1 4 2 1403 1513 AA 428 N403AA 70 39
2011 1 5 3 1405 1507 AA 428 N492AA 62 44
ArrDelay DepDelay Origin Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted
-9 1 IAH DFW 224 6 9 0 0
-8 -8 IAH DFW 224 5 17 0 0
3 3 IAH DFW 224 9 22 0 0
-3 5 IAH DFW 224 9 9 0 0
पर आप कॉलम नाम भी उपयोग कर सकते हैं, क्योंकि वे DT के स्कोप में इवैल्यूएट होते हैं।
DT[UniqueCarrier=="AA"]
#Returns all those rows where the Carrier is American Airlines
Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum TailNum ActualElapsedTime
2011 1 1 6 1400 1500 AA 428 N576AA 60
2011 1 2 7 1401 1501 AA 428 N557AA 60
2011 1 3 1 1352 1502 AA 428 N541AA 70
2011 1 4 2 1403 1513 AA 428 N403AA 70
2011 1 5 3 1405 1507 AA 428 N492AA 62
---
2011 12 27 2 1021 1333 AA 2234 N3ETAA 132
2011 12 28 3 1015 1329 AA 2234 N3FJAA 134
2011 12 29 4 1023 1335 AA 2234 N3GSAA 132
2011 12 30 5 1024 1334 AA 2234 N3BAAA 130
2011 12 31 6 1024 1343 AA 2234 N3HNAA 139
AirTime ArrDelay DepDelay Origin Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted
40 -10 0 IAH DFW 224 7 13 0 0
45 -9 1 IAH DFW 224 6 9 0 0
48 -8 -8 IAH DFW 224 5 17 0 0
39 3 3 IAH DFW 224 9 22 0 0
44 -3 5 IAH DFW 224 9 9 0 0
---
112 -12 1 IAH MIA 964 8 12 0 0
112 -16 -5 IAH MIA 964 9 13 0 0
110 -10 3 IAH MIA 964 12 10 0 0
110 -11 4 IAH MIA 964 9 11 0 0
119 -2 4 IAH MIA 964 8 12 0 0
ध्यान दें कि डेटा टेबल में पंक्तियों का सबसेट बनाते समय आपको कॉमा लगाने की ज़रूरत नहीं है। किसी data.frame में DF[2:5] करने से 2वें से 5वें कॉलम की सभी पंक्तियाँ मिलेंगी। इसके बजाय (जैसा कि यह पढ़ने वाला हर कोई जानता है), हमें DF[2:5,] निर्दिष्ट करना पड़ता है। यह भी नोट करें कि data.table के लिए DT[,2:5] का कोई अर्थ नहीं है, जैसा कि data.table पैकेज के FAQs के पहले प्रश्न में समझाया गया है।
दिलचस्प और उपयोगी: पंक्तियों का सबसेट बनाते समय आप DT[…] कमांड में प्रतीक .N भी उपयोग कर सकते हैं, जो पंक्तियों की संख्या या अंतिम पंक्ति को दर्शाता है। आप इसका उपयोग अंतिम पंक्ति या उससे ऑफ़सेट चुनने के लिए कर सकते हैं।
DT[.N-1]
#Returns the penultimate row of DT
Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum TailNum ActualElapsedTime AirTime
2011 12 6 2 656 812 WN 621 N727SW 76 64
ArrDelay DepDelay Origin Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted
-13 -4 HOU TUL 453 3 9 0 0
‘j’ भाग का उपयोग कॉलम चुनने और उनके साथ काम करने के लिए होता है। और काम का अर्थ सचमुच कुछ भी हो सकता है। तरह-तरह के फ़ंक्शंस उपयोग किए जा सकते हैं, जो data.table पैकेज की बड़ी ताकत है।
DT[, mean(na.omit(ArrDelay))]
[1] 7.094334
ध्यान दें कि 'i' भाग खाली छोड़ा गया है, और कोष्ठकों में पहली चीज़ कॉमा है। यह पहले थोड़ा अटपटा लग सकता है। हालांकि, इसका सीधा अर्थ है कि हम किसी भी पंक्ति पर सबसेट नहीं कर रहे हैं, यानी सभी पंक्तियाँ चुनी जाती हैं। 'j' भाग में, सभी उड़ानों पर आगमन के समय औसत देरी की गणना की जाती है। लगता है कि hflights डेटासेट में औसतन विमानों में 7 मिनट से अधिक की देरी थी। अगली उड़ान पकड़ते समय तैयार रहें!
जब 'j' भाग में कई कॉलम चुनकर उन पर काम करना हो, तो आपको ‘.()’ नोटेशन का उपयोग करना होता है। यह नोटेशन वास्तव में ‘list()’ का उपनाम है। यह एक डेटा टेबल लौटाता है, जबकि ‘.()’ न उपयोग करने पर केवल एक वेक्टर लौटता है, जैसा कि ऊपर दिखाया गया है।
DT[, .(mean(na.omit(DepDelay)), mean(na.omit(ArrDelay)))]
V1 V2
9.444951 7.094334
एक और उपयोगी फ़ीचर, जिसके लिए ‘.()’ नोटेशन चाहिए, आपको DT[…] कमांड के अंदर कॉलम का नाम बदलने देता है।
DT[, .(Avg_ArrDelay =
mean(na.omit(ArrDelay)))]
Avg_ArrDelay
7.094334
DT[, .(Avg_DepDelay = mean(na.omit(DepDelay)),
avg_ArrDelay = mean(na.omit(ArrDelay)))]
Avg_DepDelay Avg_ArrDelay
9.444951 7.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.390144 0.8917558 NULL NULL
यहाँ हमने DT लिया, 'i' भाग में वे सभी पंक्तियाँ चुनीं जहाँ कैरियर AA था, औसत प्रस्थान देरी और आगमन देरी की गणना की, और 'j' भाग में प्रस्थान समय के विरुद्ध प्रस्थान देरी का प्लॉट बनाया।
संक्षेप में, ‘j’ भाग का उपयोग वहीं निर्दिष्ट कॉलम पर गणनाएँ करने के लिए होता है। क्योंकि डेटा टेबल के कॉलम वैरिएबल्स माने जाते हैं, और ‘j’ के हिस्से एक्सप्रेशंस के रूप में इवैल्यूएट होते हैं, ‘j’ भाग में लगभग कुछ भी किया जा सकता है। इससे आपका प्रोग्रामिंग समय काफी कम हो जाता है।
इस data.table R ट्यूटोरियल का अंतिम खंड ‘by’ भाग पर केंद्रित है। ‘by’ भाग तब उपयोग होता है जब हम किसी विशिष्ट वैरिएबल (या उसके किसी रूपांतरण) के अनुसार समूहित करके ‘j’ भाग की गणना करना चाहते हैं। आप देखेंगे कि प्रत्येक 'by' समूह के लिए ‘j’ एक्सप्रेशन दोहराया जाता है। इसका उपयोग सरल है: आप 'by' आर्गुमेंट में उस कॉलम को निर्दिष्ट कर दें जिसके अनुसार समूह बनाना है।
DT[,mean(na.omit(DepDelay)),by=Origin]
Origin V1
IAH 8.436951
HOU 12.837873
यहाँ, हमने प्रस्थान से पहले औसत देरी की गणना की, लेकिन उसे विमान के प्रस्थान स्थल के अनुसार समूहित किया। लगता है कि HOU से उड़ने वाली उड़ानों में IAH से उड़ने वालों की तुलना में औसत देरी अधिक है।
'j' भाग की तरह ही, आप 'by' भाग में भी बहुत सा काम कर सकते हैं। 'by' भाग में फ़ंक्शंस का उपयोग किया जा सकता है ताकि ‘j’ भाग में किए गए ऑपरेशन्स के परिणाम DT[…] कमांड के अंदर हमने जो निर्दिष्ट किया है, उसके अनुसार समूहित हों। DT[…] के अंदर फ़ंक्शंस का उपयोग उस एक पंक्ति को बहुत शक्तिशाली बना देता है। इसी तरह, जब 'by' भाग में कई कॉलम उपयोग करने हों, तो ‘.()’ नोटेशन का उपयोग करना होगा।
DT[,.(Avg_DepDelay_byWeekdays = mean(na.omit(DepDelay))), by=.(Origin,Weekdays = DayOfWeek<6)]
Origin Weekdays Avg_DepDelay_byWeekdays
IAH FALSE 8.286543
IAH TRUE 8.492484
HOU FALSE 10.965384
HOU TRUE 13.433994
यहाँ, पहले सभी विमानों (क्योंकि '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)]
Origin Weekdays Avg_DepDelay Avg_ArrDelay Compensation
IAH FALSE 8.979730 4.116751 -4.825719
HOU FALSE 7.120000 2.656566 -4.555556
IAH TRUE 9.270948 6.281941 -2.836609
HOU TRUE 11.631387 10.406593 -1.278388
यहाँ 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 पैकेज पर अगली ब्लॉगपोस्ट्स में हम और तकनीकी पहलुओं पर बात करेंगे, और डेटा टेबल्स की व्यापक संभावनाओं पर ज़ूम करेंगे। जुड़े रहें!
R के बारे में और जानें
{count, plural, one {कोर्स} other {कोर्स}}
{count, plural, one {कोर्स} other {कोर्स}}
{count, plural, one {कोर्स} other {कोर्स}}