व्यावहारिक परिदृश्य में, डेटा अलग-अलग सर्वरों पर होस्ट होता है और कई अलग-अलग फाइलों में मौजूद रहता है। जब आवश्यक डेटा कई स्रोतों से आता है, तो उन्हें इस तरह एकीकृत करना आना जरूरी है कि जानकारी का नुकसान न्यूनतम हो और जो पेयरिंग आप बनाएं, वे आपके डेटा की संरचना के अनुसार अर्थपूर्ण हों।
यह ट्यूटोरियल आपको बताएगा:
- डेटासेट्स को क्षैतिज और ऊर्ध्वाधर रूप से मर्ज करना
- प्राइमरी की क्या होती है और वह आपके डेटा में संरचना कैसे जोड़ती है
- विभिन्न प्रकार के जॉइन (जैसे, लेफ्ट-जॉइन, इनर-जॉइन, फुल-जॉइन) और उनके बीच चुनाव कैसे करें
- एक सामान्य समस्या जिस पर ध्यान देना है और उसे कैसे हल करें
डेटासेट्स जोड़ना (Concatenating)
उच्च स्तर पर, आप दो तरीकों से डेटासेट्स मर्ज कर सकते हैं; या तो आप और पंक्तियाँ जोड़कर जानकारी बढ़ाते हैं या अपने डेटासेट में और कॉलम जोड़कर। सामान्यतः, जब आपके पास एक जैसे कॉलम सेट वाले डेटासेट्स हों या एक जैसी ऑब्जर्वेशन (पंक्तियाँ) हों, तो आप उन्हें क्रमशः ऊर्ध्वाधर या क्षैतिज रूप से जोड़ सकते हैं। आइए कुछ उदाहरणों से सीखते हैं।
डेटासेट्स को ऊर्ध्वाधर रूप से जोड़ना
जब आपके पास कई डेटासेट्स हों जिनमें कॉलम का सेट समान हो, तो आप एक डेटासेट को दूसरे से ऊर्ध्वाधर रूप से जोड़ सकते हैं। यानी, अपने डेटासेट के कॉलम्स को रखते हुए, आप उसमें और पंक्तियाँ जोड़ सकते हैं। ऐसी जानकारी एक फाइल में होने से एग्रीगेट करना और समग्र चित्र देखना आसान हो जाता है, बिना कई फाइलों के बीच इधर-उधर स्विच किए और उनका ट्रैक खोए।
डेटासेट 1
| Make | Num models |
|---|---|
| Honda | 63 |
| BMW | 10 |
डेटासेट 2
| Make | Num models |
|---|---|
| Ford | 26 |
| Tesla | 4 |
यह ध्यान देने योग्य है कि यदि आपके पास एक ही ऑब्जर्वेशन कई डेटासेट्स में है और आप उन्हें rbind() का उपयोग करके ऊर्ध्वाधर रूप से जोड़ते हैं, तो आपकी टेबल में डुप्लिकेट ऑब्जर्वेशन हो जाएंगे। और यद्यपि दोनों डेटासेट्स में वेरिएबल्स (अर्थात कॉलम) का सेट समान होना चाहिए, उनका क्रम एक जैसा होना आवश्यक नहीं है। नीचे दिए गए कंसोल में खुद देखें!
आपके वर्कस्पेस में ऊपर दिखाए गए dataset1 और dataset2 नाम के दो डेटासेट्स मौजूद हैं। dataset1 के कॉलम्स का क्रम बदलकर देखें। dataset1 और dataset2 के साथ-साथ reordered_dataset1 और dataset2 पर rbind() कॉल करें।
dataset1 <- data.frame(make = c("Honda", "BMW"),
num_models = c(63, 10))
dataset2 <- data.frame(make = c("Ford", "Tesla"),
num_models = c(26, 4))
# Add datasets vertically
rbind(dataset1, dataset2)
# Reorder columns
reordered_dataset1 <- dataset1[, c(2, 1)]
# See that rbind() is robust to column ordering
rbind(reordered_dataset1, dataset2)
rbind() के बाद, आपके परिणाम एक ही टेबल में सभी चार कार निर्माताओं की जानकारी कुछ इस तरह देंगे:
ऊर्ध्वाधर रूप से जोड़ा गया डेटासेट
| Make | Num models |
|---|---|
| Honda | 63 |
| BMW | 10 |
| Ford | 26 |
| Tesla | 4 |
R निःशुल्क सीखना शुरू करें
इंटरमीडिएट R
डेटासेट्स को क्षैतिज रूप से जोड़ना
जब आपके पास एक ही ऑब्जर्वेशन सेट का प्रतिनिधित्व करने वाले डेटासेट्स हों, तो आप ऐसे डेटासेट्स को क्षैतिज रूप से जोड़ सकते हैं। इस बार, अपने डेटासेट की पंक्तियों को रखते हुए, आप उसमें और कॉलम जोड़ सकते हैं। ऐसे मामलों में, आपको यह जाँचना चाहिए कि ऑब्जर्वेशन का क्रम समान है। यदि आपके डेटासेट्स में पंक्तियों की संख्या अलग है, या पंक्तियों की संख्या समान है लेकिन उनका क्रम असंगत है, तो आप कॉलम सेट्स को ऐसे पेयर कर सकते हैं जो तार्किक न हों।
ऊपर के उदाहरण का विस्तार करते हैं। मान लीजिए आपके पास दो डेटा फाइलें हैं: एक में कार का मेक और उपलब्ध यूनिक मॉडलों की संख्या है, और दूसरी में कार का मेक और कुल बिक्री:
उपलब्ध यूनिक मॉडलों की संख्या
| Make | Num models |
|---|---|
| Honda | 63 |
| BMW | 10 |
| Ford | 26 |
| Tesla | 4 |
कुल बिक्री
| Make | Sales |
|---|---|
| Ford | 119157 |
| BMW | 25908 |
| Honda | 188328 |
| Tesla | 29975 |
यह ध्यान देने योग्य है कि यदि आपके पास एक ही ऑब्जर्वेशन कई डेटासेट्स में है और आप उन्हें cbind() का उपयोग करके क्षैतिज रूप से जोड़ते हैं, तो आपकी टेबल में अनावश्यक दोहराए गए कॉलम हो जाएंगे। और भले ही दोनों डेटासेट्स में संबंधित जानकारी हो, पंक्तियों का क्रम मायने रखता है!
नीचे दिए गए कंसोल में, models और sales पर cbind() कॉल करें और परिणाम प्रिंट करें:
models <- data.frame(make = c("Honda", "BMW", "Ford", "Tesla"),
num_models = c(63, 10, 26, 4))
sales <- data.frame(make = c("Ford", "BMW", "Honda", "Tesla"),
sales = c(119157, 25908, 188328, 29975))
# Add datasets horizontally
cbind(models, sales)
आपको कुछ ऐसा मिला होगा:
Models & Sales
| Make | Num models | Make | Sales |
|---|---|---|---|
| Honda | 63 | Ford | 119157 |
| BMW | 10 | BMW | 25908 |
| Ford | 26 | Honda | 188328 |
| Tesla | 4 | Tesla | 29975 |
क्या आप यहाँ समस्या देख रहे हैं? यह डेटा टाइडी नहीं है!
इस आधारभूत कोर्स में सिखाए गए टाइडी डेटा के सिद्धांतों के अनुसार, किसी डेटासेट की हर ऑब्जर्वेशन एक यूनिक पंक्ति में दर्शाई जानी चाहिए। और अगर आपके पास किसी एक डेटासेट में केवल कुछ पंक्तियों की जानकारी हो और आप केवल उन्हीं के लिए जानकारी जोड़ना चाहें जिन पर आपके पास अधिक जानकारी है? दूसरे शब्दों में, यदि आप एक डेटासेट से दूसरे में और कॉलम जोड़ना चाहें, लेकिन इन डेटासेट्स में ऑब्जर्वेशन की संख्या समान न हो तो?
प्राइमरी की और फॉरेन कीज
डेटासेट्स को मिलाने की शुरुआत करने पर पहला कदम है अपने डेटासेट की प्राइमरी की ढूँढ़ना। प्राइमरी की वह कॉलम या कॉलम्स का समूह है जो आपके डेटासेट में प्रत्येक ऑब्जर्वेशन की विशिष्ट पहचान करता है। कार मेक, यूनिक मॉडलों की संख्या और कुल बिक्री वाले उदाहरण में, आपके डेटासेट्स की प्राइमरी की make कॉलम है।
अब, हम joins कर सकते हैं—जो डेटासेट्स को एक टेबल में मर्ज करने का मानक तरीका है।
जॉइन के प्रकार
जॉइन के कई प्रकार होते हैं। आप Joining Data in R with dplyr कोर्स में सीख सकते हैं कि म्यूटेटिंग जॉइन के जरिए एक डेटासेट के कॉलम्स को दूसरे के कॉलम्स से कैसे बढ़ाया जाए, फिल्टरिंग जॉइन से एक डेटासेट को दूसरे के मुकाबले कैसे फिल्टर करें, और सेट ऑपरेशन्स से डेटासेट्स को कैसे छाँटें। नीचे कुछ सबसे आम प्रकार दिए गए हैं।
left_join(x, y): x की सभी पंक्तियाँ, और x व y के सभी कॉलम लौटाता है। जिन पंक्तियों का y में मिलान नहीं है, उनके नए कॉलम्स में NA होगा। यदि x और y के बीच कई मैच हों, तो सभी संयोजन लौटाए जाते हैं।
inner_join(x, y): x की वे सभी पंक्तियाँ लौटाता है जिनके लिए y में मिलान मौजूद है, और x व y के सभी कॉलम। यदि x और y के बीच कई मैच हों, तो सभी संयोजन लौटाए जाते हैं।
full_join(x, y): x और y दोनों की सभी पंक्तियाँ और सभी कॉलम लौटाता है। जहाँ मिलान नहीं है, वहाँ अनुपस्थित पक्ष के लिए NA लौटाया जाता है।
ऊपर बताए गए जॉइन म्यूटेटिंग जॉइन के उदाहरण हैं, क्योंकि ये दो डेटासेट्स के वेरिएबल्स को संयोजित करते हैं।
गायब कीज
मान लीजिए आपके पास दो डेटासेट्स हैं। पहला डेटासेट size कहलाता है और इसमें लोगों के नाम और उनकी शर्ट का साइज है:
> size
name size
1 Tom M
2 Dan XL
3 Keil S
दूसरा डेटासेट color कहलाता है और इसमें लोगों के सरनेम, शर्ट के रंग की पसंद, और कुछ जानकारी row.names एट्रिब्यूट में संग्रहीत है:
> color
surname color
Tom Jeon <NA>
Dan Smith Dark
Bob McLadden Light
ध्यान दें कि यहाँ क्या गलत हो सकता है? जब कीज गायब हों या डुप्लिकेट हों तो दो-टेबल जॉइन जटिल हो सकते हैं। इस उदाहरण में, R के डेटा फ्रेम महत्वपूर्ण जानकारी को row.names एट्रिब्यूट में स्टोर करते हैं। जब ऐसा होता है, तो आप जॉइन फ़ंक्शन से उस की तक पहुँच नहीं पाएँगे, क्योंकि जॉइन फ़ंक्शन केवल डेटा फ्रेम के कॉलम्स तक ही पहुँच सकते हैं।
इस समस्या को आसानी से ठीक करने की तरकीब है tibble पैकेज का rownames_to_column() फ़ंक्शन उपयोग करना। यह आपके डेटासेट की एक कॉपी लौटाता है जिसमें रो नेम्स को डेटा में एक कॉलम के रूप में जोड़ दिया जाता है। rownames_to_column() का पहला आर्ग्युमेंट आपका डेटा फ्रेम ऑब्जेक्ट होता है और दूसरा आर्ग्युमेंट उस कॉलम का नाम बताने वाली स्ट्रिंग होती है जिसे आप जोड़ना चाहते हैं।
नीचे दिए गए कंसोल में अन्वेषण करके देखें। डेटासेट्स size और color आपके वर्कस्पेस में पहले से लोड हैं।
color <- data.frame(surname = c("Jeon", "Smith", "McLadden"), color = c(NA, "Dark", "Light"))
row.names(color) <- c("Tom", "Dan", "Bob")
size <- data.frame(name = c("Tom", "Dan", "Keil"), size = c("M", "XL", "S"))
# Explore here!
अंतिम विचार
वास्तविक दुनिया में, डेटा कई डेटासेट्स और कई अलग-अलग फॉर्मैट्स में बँटा हो सकता है। चूँकि R एकल टेबल्स के साथ काम करने के लिए डिज़ाइन किया गया है, इसलिए डेटासेट्स में हेरफेर कर उन्हें एक टेबल में संयोजित करना एक आवश्यक कौशल है। Importing & Cleaning Data with R स्किल ट्रैक पूरा करें और किसी भी फॉर्मैट में डेटा को पार्स और संयोजित करना सीखें। DataCamp का R Data Import ट्यूटोरियल भी देखें। सीखते रहिए!