मुख्य सामग्री पर जाएँ

R में Long से Wide डेटा

जानें कि आप अपने डेटा को लंबे से चौड़े फ़ॉर्मैट में और इसके विपरीत क्यों बदलेंगे, और R में melt() और dcast() के साथ यह कैसे करें!
· 15 मि॰ पढ़ें

AI के साथ खोजें

ऐसा समय आता है जब लोगों को long फॉर्मेट (इसे आप "लॉन्ग-फॉर्म" कहते हैं—इसका मतलब आगे स्पष्ट होगा) के डेटा को wide फॉर्मेट में और wide को long में बदलने की जरूरत पड़ती है। वास्तविक जीवन में डेटा अलग-अलग फॉर्मेट में आता है, लेकिन अधिकांश R फ़ंक्शन एक विशेष फॉर्म के लिए बनाए गए होते हैं।

उदाहरण के लिए, मिश्रित रैखिक मॉडलिंग के लिए lme4::lmer(), विज़ुअलाइज़ेशन के लिए ggplot2::ggplot() लॉन्ग-फॉर्म के लिए डिज़ाइन किए गए हैं। लेकिन कुछ अन्य फ़ंक्शन wide-फॉर्म के लिए बने हैं, जैसे mosaicplot()। इसका मतलब है कि विश्लेषण या विज़ुअलाइज़ेशन करने के लिए आपको फॉर्मेट बदलना पड़ेगा, जब तक कि डेटा पहले से प्रोसेस होकर सही फॉर्म में न हो।

R में फॉर्मेट कन्वर्ज़न के कई विकल्प हैं, लेकिन शुरुआत में यह काफी उलझाऊ लग सकता है।

यह ट्यूटोरियल आपको लॉन्ग-फॉर्म और वाइड-फॉर्म के बीच डेटा कन्वर्ट करने की बुनियादी प्रक्रिया समझाएगा। आप निम्नलिखित विषयों को एक्सप्लोर करेंगे:

  • आप लॉन्ग फॉर्म के बारे में और जानेंगे।
  • फिर, आप वाइड फॉर्म से परिचित होंगे।
  • आप लॉन्ग और वाइड फॉर्मेट्स के बीच के अंतर को रिकैप करेंगे;
  • इसके बाद आप देखेंगे कि एक फॉर्म से दूसरे में जाने के लिए किन स्टेप्स की जरूरत होती है।
  • अंत में, आप R की मदद से इसे इम्प्लीमेंट करेंगे। आप melt() और dcast() फ़ंक्शंस के साथ long फॉर्मेट से wide फॉर्मेट में जाना सीखेंगे।

डेटा

तालिका 01
namegenderyear2011year2012year2013year2014year2015
Jackson SmithM74.6984.9991.73105.11111.04
Sophia JohnsonFNANANANA75.89
Emma WilliamsFNANA75.7486.5091.50
Aiden JonesMNANANA71.8981.42
Liam BrownM88.2496.91101.85108.13112.45
Lucas DavisM70.6083.7894.17100.03106.35
Olivia MillerF64.7880.7687.3097.13103.80
Ava WilsonF88.7796.45104.72112.84NA

यह तालिका एक छोटे स्थानीय क्षेत्र में शिशुओं की लंबाई दिखाती है। लंबाई 2011 से 2015 तक मापी गई। जैसा कि आप जानते होंगे, NA का मतलब ‘Not Available’ है। NA की पोज़िशंस से आप शिशुओं की उम्र का अंदाज़ा लगा सकते हैं, लेकिन किसी शिशु की सटीक उम्र तालिका से नहीं मिलती। तालिका सुव्यवस्थित दिखती है, लेकिन जो लोग शिशुओं की वृद्धि का अध्ययन करना चाहते हैं, उनके लिए एक समस्या है: महत्वपूर्ण जानकारी यह नहीं है कि कब (एब्सोल्यूट समय) मापा गया, बल्कि यह कि शिशु की उम्र कितनी थी जब माप लिया गया। क्या आप यह जानकारी तालिका में जोड़ सकते हैं? नीचे एक तरीका दिखाया गया है:

तालिका 02
namegenderage0age1age2age3age4age5age6
Jackson SmithMNA76.6984.9197.06105.73107.32NA
Sophia JohnsonFNA76.05NANANANANA
Emma WilliamsF72.6582.4691.76NANANANA
Aiden JonesM69.7679.89NANANANANA
Liam BrownMNANA85.3493.22105.78105.84114.82
Lucas DavisM71.5984.8792.10100.73104.21NANA
Olivia MillerF62.7481.3992.0298.32106.44NANA
Ava WilsonFNANA88.39100.67107.58111.52NA

NA की संख्या बढ़ गई है। ## वाइड फॉर्म डेटा लेकिन यदि आप बताना चाहें कि शिशु कितने महीनों का था, तो आप क्या करेंगे? यह कुछ इस तरह दिखेगा:

तालिका 03
namegenderm4m6m7m10m12...m55m60m65m72
Jackson SmithMNANANANA76.69...NA107.32NANA
Sophia JohnsonFNANANANA76.05...NANANANA
Emma WilliamsFNANANA72.65NA...NANANANA
Aiden JonesMNA69.76NANANA...NANANANA
Liam BrownMNANANANANA...NA105.84NA114.82
Lucas DavisMNANA71.59NANA...104.21NANANA
Olivia MillerF62.74NANANANA...NANANANA
Ava WilsonFNANANANANA...NANA111.52NA

ऊपर की तालिका में बहुत सारे NA हैं। यदि शिशुओं के सापेक्ष मापन समय अलग-अलग हों, तो वाइड फॉर्म बहुत जगह बर्बाद कर सकता है। एक और विकल्प यह है कि 2015 के साल में शिशुओं की उम्र शामिल की जाए, लेकिन यह तभी संभव है जब एब्सोल्यूट मापन समय सबके लिए एक जैसा हो। अगर शिशु महीनों के हिसाब से अलग-अलग समय पर मापे गए हों और आप उम्र महीनों में जानना चाहें, तो यह तरीका काम नहीं करता। तब यह उदाहरण ही एकमात्र तरीका लगता है। ऐसे में आप लॉन्ग-फॉर्म का उपयोग करने पर विचार कर सकते हैं। ## लॉन्ग फॉर्म में डेटा जहाँ वाइड-फॉर्म में एक शिशु के सारे मापन एक ही पंक्ति में दिखते हैं, वहीं लॉन्ग-फॉर्म में एक पंक्ति में एक ही माप दिखेगा। इसे पाने का सबसे सरल तरीका है: एक पंक्ति में बच्चे का नाम, मापन का समय, और मापन (लंबाई) दिखाना। यही इस तालिका में है:

तालिका 04
namegendermonthheight
Olivia MillerF462.74
Aiden JonesM669.76
Lucas DavisM771.59
Emma WilliamsF1072.65
Jackson SmithM1276.69
............
Liam BrownM72114.82

यदि आप डेटा को नामों के अनुसार सॉर्ट कर दें, तो आपको नीचे जैसी तालिका मिलेगी। साफ है, यह तालिका ऊपर की तालिका 3 से कम जगह घेरती है!

तालिका 05
namegendermonthheight
Jackson SmithM1276.69
Jackson SmithM2484.91
Jackson SmithM3697.06
Jackson SmithM48105.73
Jackson SmithM60107.32
Sophia JohnsonF1276.05
Emma WilliamsF1072.65
............
Ava WilsonF65111.52

लॉन्ग बनाम वाइड

ध्यान दें एक बार फिर कि वाइड-फॉर्म और लॉन्ग-फॉर्म के बीच बुनियादी फर्क क्या है: एक सरल अंतर यह है कि वाइड-फॉर्म में एक व्यक्ति के कई माप एक पंक्ति में दिखते हैं और कॉलम नाम बताते हैं कि वे माप क्या हैं।

यह तालिका Liam Brown की 2011-2015 की लंबाइयाँ एक पंक्ति में दिखाती है:

तालिका 06
namegenderyear2011year2012year2013year2014year2015
Liam BrownM88.2496.91101.85108.13112.45

लॉन्ग-फॉर्म में Liam Brown की लंबाइयाँ एक कॉलम में दिखाई जाती हैं:

तालिका 07
namegender_
Liam BrownM85.34
Liam BrownM93.22
Liam BrownM105.78
Liam BrownM105.84
Liam BrownM114.82

जैसा कि आप देख सकते हैं, आपको यह नहीं पता चलता कि ये माप किसके लिए हैं। यदि आप कॉलम नाम लिख दें, तो यह इस तरह दिखेगा:

तालिका 08
namegenderyear2011, 2012, 2013, 2014, 2015
Liam BrownM85.34
Liam BrownM93.22
Liam BrownM105.78
Liam BrownM105.84
Liam BrownM114.82

लेकिन इसमें अपनी समस्या है। Sophia Johnson की लंबाई 2011-2014 में मापी ही नहीं गई। तो आप नीचे देख सकते हैं, कॉलम नाम आसानी से सेट नहीं किया जा सकता:

तालिका 09
namegender?
Liam BrownM85.34
Liam BrownM93.22
Liam BrownM105.78
Liam BrownM105.84
Liam BrownM114.82
Sophia JohnsonF76.05

वाइड-फॉर्म से लॉन्ग-फॉर्म

वाइड-फॉर्म को लॉन्ग-फॉर्म में बदलना एक क्रमबद्ध प्रक्रिया की तरह समझा जा सकता है। एक पंक्ति के मापों को एक कॉलम में बदलने से पहले, आप तालिका को इस तरह बना सकते हैं कि हर पंक्ति में केवल एक ही माप हो। आइए इस तालिका के लिए यह करें:

तालिका 10
namegenderage0age1age2age3age4age5age6
Emma WilliamsF72.6582.4691.76NANANANA
Aiden JonesM69.7679.89NANANANANA

परिणाम नीचे की तालिका जैसा है:

तालिका 11
namegenderage0age1age2age3age4age5age6
Emma WilliamsF72.65  NANANANA
Emma WilliamsF 82.46    NA
Emma WilliamsF  91.76    
Aiden JonesM69.76 NANANANANA
Aiden JonesM 79.89     

उन मापों को, जो कॉलमों में बिखरे हैं, एक कॉलम में इकट्ठा करने से पहले, आपको एक अतिरिक्त कॉलम बनाना होगा जो बताए कि ये माप क्या हैं, जैसे नीचे:

तालिका 12
namegendermeasureage0age1age2age3age4age5age6
Emma WilliamsFage072.65  NANANANA
Emma WilliamsFage1 82.46    NA
Emma WilliamsFage2  91.76    
Aiden JonesMage069.76 NANANANANA
Aiden JonesMage1 79.89     

कॉलम का नाम आमतौर पर “measure” या “key” होता है। आप ऊपर की तालिका में देख सकते हैं कि “age0”, “age1”, “age2”, “age3”, “age4”, “age5” कॉलम नामों में भी हैं और एक कॉलम के अंदर भी। यदि आप कॉलम नामों को छोड़ दें, तो तालिका इस तरह होगी।

तालिका 13
namegendermeasure____________________________
Emma WilliamsFage072.65  NANANANA
Emma WilliamsFage1 82.46     
Emma WilliamsFage2  91.76    
Aiden JonesMage069.76 NANANANANA
Aiden JonesMage1 79.89     

क्योंकि हर पंक्ति में केवल एक माप है, आप उन्हें एक कॉलम में इकट्ठा कर सकते हैं और परिणाम निम्न होगा:

तालिका 14
namegendermeasure 
Emma WilliamsFage072.65
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Aiden JonesMage069.76
Aiden JonesMage179.89

आइए सभी मापों के लिए नए कॉलम का नाम बनाते हैं। आमतौर पर इसे "value" कहा जाता है:

तालिका 15
namegendermeasurevalue
Emma WilliamsFage072.65
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Aiden JonesMage069.76
Aiden JonesMage179.89

ऊपर की तालिका देखें। क्या आप नोटिस करते हैं कि "age" दोहर रहा है? आप दोहराए जा रहे हिस्से को हटा सकते हैं, जिससे निम्न परिणाम मिलेगा:

तालिका 16
namegenderagevalue
Emma WilliamsF072.65
Emma WilliamsF182.46
Emma WilliamsF291.76
Aiden JonesM069.76
Aiden JonesM179.89

Age, जो हर पंक्ति में दोहर रहा था, अब एक कॉलम नाम है। ऊपर की तालिका में value कॉलम नाम और अधिक विशिष्ट हो सकता है। आपने इसे height से बदल दिया है, जो ज्यादा स्पष्ट है। परिणाम नीचे की तालिका में देखें:

तालिका 17
namegenderageheight
Emma WilliamsF072.65
Emma WilliamsF182.46
Emma WilliamsF291.76
Aiden JonesM069.76
Aiden JonesM179.89

आइए तालिका 15 की तुलना तालिका 17 से करें। तालिका 15 का value कॉलम कुछ भी दर्शा सकता है, लेकिन तालिका 17 का height बहुत विशिष्ट है: यह केवल लंबाई को दर्शाता है, जबकि तालिका 15 का value किसी भी प्रकार का मान हो सकता था—जैसे लंबाई, वजन, गति या रंग। एक और तरीका नीचे जैसा हो सकता है:

तालिका 18
namegendermeasurevalue
Emma WilliamsFheight.age072.65
Emma WilliamsFheight.age182.46
Emma WilliamsFheight.age291.76
Aiden JonesMheight.age069.76
Aiden JonesMheight.age179.89

उस स्थिति पर विचार करें जिसमें मापन विविध हों। यदि मापन लंबाई, वजन और BMI हों, तो यह नीचे की तालिका जैसा होगा। लेकिन इस स्थिति में value कॉलम में अलग-अलग स्केल के संख्यात्मक मान होंगे, जिससे पढ़ना भ्रमित कर सकता है। इस तालिका में लंबाई सेंटीमीटर में और वजन किलोग्राम में मापा गया है:

तालिका 19
namegendermeasurevalue
Emma WilliamsFheight72.65
Emma WilliamsFweight8.22
Emma WilliamsFBMI22.60
Aiden JonesMheight69.76
Aiden JonesMweight8.51

इसलिए वाइड-फॉर्म को लॉन्ग-फॉर्म में बदलते समय, आपको तय करना होता है कि किन मानों को एक कॉलम में इकट्ठा किया जाएगा। उसके बाद आप कॉलम का नाम तय कर सकते हैं।

अब तक कही बातों का सार: वाइड-फॉर्म को लॉन्ग-फॉर्म में बदलने के लिए, यह तय करना पड़ता है कि किन कॉलमों को मॉडिफाई करके एक कॉलम में लाया जाएगा। ऐसा करते समय, कई कॉलम एक कॉलम में संयोजित होते हैं। इसलिए उस कॉलम के लिए एक कॉलम नाम चाहिए, जैसा कि अगली तालिकाओं में दिखता है:

तालिका 20
id1id2age0age1age2
Emma WilliamsFNA82.4691.76
Aiden JonesM69.7679.89NA
Emma WilliamsFNA82.4691.76
तालिका 21
id1id2age0age1age2
Emma WilliamsFNA  
Emma WilliamsF 82.46 
Emma WilliamsF  91.76
Aiden JonesM69.76  
Aiden JonesM 79.89 
Aiden JonesM  NA
Emma WilliamsFNA  
Emma WilliamsF 82.46 
Emma WilliamsF  91.76
तालिका 22
id1id2age_age0age1age2
Emma WilliamsFage0NA  
Emma WilliamsFage1 82.46 
Emma WilliamsFage2  91.76
Aiden JonesMage069.76  
Aiden JonesMage1 79.89 
Aiden JonesMage2  NA
Emma WilliamsFage0NA  
Emma WilliamsFage1 82.46 
Emma WilliamsFage2  91.76
तालिका 23
id1id2age_ 
Emma WilliamsFage0NA
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Aiden JonesMage069.76
Aiden JonesMage179.89
Aiden JonesMage2NA
Emma WilliamsFage0NA
Emma WilliamsFage182.46
Emma WilliamsFage291.76
तालिका 24
id1id2keyvalue
Emma WilliamsFage0NA
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Aiden JonesMage069.76
Aiden JonesMage179.89
Aiden JonesMage2NA
Emma WilliamsFage0NA
Emma WilliamsFage182.46
Emma WilliamsFage291.76
तालिका 25
id1id2keyvalue
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Aiden JonesMage069.76
Aiden JonesMage179.89
Emma WilliamsFage182.46
Emma WilliamsFage291.76

आइए ऊपर दी गई तालिका में कॉलम id1 और id2 को देखें। id2 किसी व्यक्ति को निर्दिष्ट नहीं करता बल्कि यह व्यक्ति का गुण (लिंग) बताता है। दूसरे शब्दों में, आप कह सकते हैं कि यह एक मापन है। इसलिए आप इसे लंबे-रूप में बदल सकते हैं। सबसे लंबे-रूप में तीन कॉलम होते हैं: id, key और value।

तालिका 26
idkeyvalue
Emma WilliamsgenderF
Emma Williamsage182.46
Emma Williamsage291.76
Aiden JonesgenderF
Aiden Jonesage069.76
Aiden Jonesage179.89
Emma WilliamsgenderF
Emma Williamsage182.46
Emma Williamsage291.76

ऊपर की तालिका तालिका 25 से प्राप्त सबसे लंबे-रूप को दिखाती है। लेकिन अलग-अलग लोगों के नाम एक जैसे हो सकते हैं।

ऐसे में, लंबे-रूप से भ्रम हो सकता है क्योंकि id एक व्यक्ति को निर्दिष्ट नहीं कर पाता। आप नाम के पीछे एक संख्या लगाकर लोगों को अलग कर सकते हैं (उदाहरण के लिए, R फ़ंक्शन make.unique() का उपयोग करके), लेकिन आप उस नाम में अंतर नहीं कर पाएंगे जो बदला गया है और वह मूल नाम जिसमें संख्या पहले से शामिल है। सोचिए किसी व्यक्ति का वास्तविक नाम ही "John.2" हो!

इसका स्पष्ट समाधान यह है कि अलग-अलग व्यक्तियों को अलग-अलग संख्यात्मक ID आवंटित की जाए। इस स्थिति में, नाम भी एक अन्य मापन बन जाते हैं।

अगली तालिका दिखाती है कि नामों को भी मापन माना गया है। एक मायने में, यही वास्तविक सबसे लंबा-रूप है।

तालिका 27
idkeyvalue
1nameEmma Williams
1genderF
1age182.46
1age291.76
2nameAiden Jones
2genderF
2age069.76
2age179.89
3nameEmma Williams
3genderF
3age182.46
3age291.76

सबसे लंबा-रूप, चौड़े-रूप को बनाने के लिए सबसे आसान रूप है। यदि आप चौड़े-रूप को लंबे-रूप में बदलने की प्रक्रिया को उल्टा करें, जैसा कि तालिका 20 से 25 में दिखाया गया है, तो आप फिर से चौड़े-रूप पर पहुँच जाते हैं। नीचे की अगली तालिकाएँ यह प्रक्रिया दिखाती हैं:

तालिका 28. key कॉलम में दिए मापन कॉलम नाम में दोहराए गए हैं
idkeynamegenderage0age1age2
1nameEmma Williams    
1gender F   
1age1   82.46 
1age2    91.76
2nameAiden Jones    
2gender F   
2age0  69.76  
2age1   79.89 
3nameEmma Williams    
3gender F   
3age1   82.46 
3age2    91.76
तालिका 29. key कॉलम हटाया जा सकता है
idnamegenderage0age1age2
1Emma Williams    
1 F   
1   82.46 
1    91.76
2Aiden Jones    
2 F   
2  69.76  
2   79.89 
3Emma Williams    
3 F   
3   82.46 
3    91.76
तालिका 30. समान id को एक पंक्ति में समेटा जा सकता है
idnamegenderage0age1age2
1Emma WilliamsF 82.4691.76
1     
1     
1     
2Aiden JonesF69.7679.89 
2     
2     
2     
3Emma WilliamsF 82.4691.76
3     
3     
3     
तालिका 31. जिन पंक्तियों में कोई मापन न हो उन्हें हटाएँ
idnamegenderage0age1age2
1Emma WilliamsF 82.4691.76
2Aiden JonesF69.7679.89 
3Emma WilliamsF 82.4691.76

चौड़े-रूप को लंबे-रूप में बदलते समय मुख्य बात यह तय करना है कि किन कॉलमों को एक कॉलम में समेटा जाएगा।

लेकिन यह केवल एक कॉलम तक सीमित नहीं है। यदि आवश्यक हो तो आप दो कॉलम भी इस्तेमाल कर सकते हैं, ठीक नीचे दी गई तालिका की तरह:

तालिका 32
namegenderh2011h2012w2011w2012
Jackson SmithM74.6984.999.6012.0
Olivia MillerFNA80.767.1510.7
Ava WilsonF88.7796.45NA15.0

क्या आप इसे लंबे-रूप में बना सकते हैं?

कॉलम h2011, h2012, w2011, w2012 साल 2011 और 2012 में ऊँचाई और वज़न को दर्शाते हैं। height और weight अलग-अलग मात्रकों में मापे जाते हैं - सेमी, किलोग्राम। इसलिए आप ऊँचाई और वज़न दोनों के लिए एक ही कॉलम का उपयोग कर सकते हैं, या फिर दो अलग कॉलम भी रख सकते हैं, ठीक इस तालिका की तरह:

तालिका 33
namegenderyearheightweight
Jackson SmithM201174.699.60
Jackson SmithM201284.9912.00
Olivia MillerF2011NA80.76
Olivia MillerF20127.1510.70
Ava WilsonF201188.7796.45
Ava WilsonF2012NA15.00

क्या यह लंबा-रूप है या चौड़ा-रूप?

R में लंबे से चौड़े डेटा तक

आइए R के साथ लंबे-रूप और चौड़े-रूप के बीच रूपांतरण करें। इस काम के लिए कई फ़ंक्शन और पैकेज उपलब्ध हैं।

तालिका 34
funcpackageto_long_formto_wide_form
stack/unstackutilsstackunstack
reshapestatsreshape(direction="long", ...)reshape(direction="wide", ...)
melt/dcastreshape2meltdcast
gather/spreadtidyrgatherspread

यहाँ मैं reshape2 पैकेज के melt() और dcast() फ़ंक्शनों का उपयोग कैसे करें, यह समझाऊँगा। वजह यह है कि stack() और unstack() बुनियादी फ़ंक्शन हैं, इसलिए उनके परिणामों पर बाद में अतिरिक्त प्रोसेसिंग करनी पड़ती है। ध्यान दें कि gather() और spread() tidyr के फ़ंक्शन हैं जो काफी लोकप्रिय भी हैं, लेकिन इस ट्यूटोरियल में उन्हें शामिल नहीं किया गया है।

एक और फ़ंक्शन जिसे आप उपयोग कर सकते हैं, वह है reshape(), जो stats पैकेज के साथ आता है। दरअसल, इस फ़ंक्शन से भ्रमित न हों, क्योंकि एक पैकेज reshape नाम से भी है! यह पैकेज, reshape2 के साथ मिलकर, उन लोगों के लिए विकसित किया गया था जिन्हें reshape() से जूझना पड़ रहा था। इसके अलावा, reshape() फ़ंक्शन ऐसा प्रतीत होता है कि डेटा के अनुदैर्ध्य होने की धारणा रखता है, यानी समय के साथ मापन दोहराए जाते हैं।

आइए तालिका 35 के डेटा को लंबे-रूप में बदलें। मान लें कि नीचे दी गई तालिका में एक data.frame dat नाम से संग्रहीत है।

तालिका 35
namegenderyear2011year2012year2013
Jackson SmithM74.6984.9991.73
Emma WilliamsFNANA75.74
Liam BrownM88.24NA101.85
Ava WilsonF88.7796.45NA

babies = data.frame(name= c("Jackson Smith", "Emma Williams", "Liam Brown", "Ava Wilson"), gender = c("M", "F", "M", "F"), year2011= c(74.69, NA, 88.24, 88.77), year2012=c(84.99, NA, NA, 96.45), year2013=c(91.73, 75.74, 101.83, NA)) babies

##            name gender year2011 year2012 year2013
## 1 Jackson Smith      M    74.69    84.99    91.73
## 2 Emma Williams      F       NA       NA    75.74
## 3    Liam Brown      M    88.24       NA   101.83
## 4    Ava Wilson      F    88.77    96.45       NA

वह सवाल जो आप पूछना चाहेंगे: "कौन-से कॉलमों को एक कॉलम में जोड़ा जाए?"

वे होंगे year2011, year2012, year2013। जब आप melt() फ़ंक्शन का उपयोग करते हैं, तो इन कॉलमों को measure.vars में सूचीबद्ध करना चाहिए:

melt(babies, measure.vars = c("year2011", "year2012", "year2013"))

##             name gender variable  value
## 1  Jackson Smith      M year2011  74.69
## 2  Emma Williams      F year2011     NA
## 3     Liam Brown      M year2011  88.24
## 4     Ava Wilson      F year2011  88.77
## 5  Jackson Smith      M year2012  84.99
## 6  Emma Williams      F year2012     NA
## 7     Liam Brown      M year2012     NA
## 8     Ava Wilson      F year2012  96.45
## 9  Jackson Smith      M year2013  91.73
## 10 Emma Williams      F year2013  75.74
## 11    Liam Brown      M year2013 101.83
## 12    Ava Wilson      F year2013     NA

year2011, year2012, year2013 क्रमशः 3रे, 4थे, 5वें कॉलम में हैं, इसलिए आप यह भी कर सकते हैं:

melt(babies, measure.vars = 3:5)

##             name gender variable  value
## 1  Jackson Smith      M year2011  74.69
## 2  Emma Williams      F year2011     NA
## 3     Liam Brown      M year2011  88.24
## 4     Ava Wilson      F year2011  88.77
## 5  Jackson Smith      M year2012  84.99
## 6  Emma Williams      F year2012     NA
## 7     Liam Brown      M year2012     NA
## 8     Ava Wilson      F year2012  96.45
## 9  Jackson Smith      M year2013  91.73
## 10 Emma Williams      F year2013  75.74
## 11    Liam Brown      M year2013 101.83
## 12    Ava Wilson      F year2013     NA

परिणाम ऊपर की तालिका में है। ध्यान दें कॉलम नाम variable और value। तालिका 23 और तालिका 24 ने दिखाया था कि नए कॉलम नामों की ज़रूरत पड़ती है। melt() फ़ंक्शन के पास नए कॉलमों के लिए डिफ़ॉल्ट नाम होते हैं - variable और value। आप इन्हें variable.name= और value.name= आर्ग्युमेंट से बदल सकते हैं। आइए नीचे ऐसा करते हैं:

melt(babies, measure.vars=3:5, variable.name="year", value.name="height")

##             name gender     year height
## 1  Jackson Smith      M year2011  74.69
## 2  Emma Williams      F year2011     NA
## 3     Liam Brown      M year2011  88.24
## 4     Ava Wilson      F year2011  88.77
## 5  Jackson Smith      M year2012  84.99
## 6  Emma Williams      F year2012     NA
## 7     Liam Brown      M year2012     NA
## 8     Ava Wilson      F year2012  96.45
## 9  Jackson Smith      M year2013  91.73
## 10 Emma Williams      F year2013  75.74
## 11    Liam Brown      M year2013 101.83
## 12    Ava Wilson      F year2013     NA

ऊपर के उदाहरणों में मापन सीधे बताए गए थे। जिन परिस्थितियों से आप निपट रहे हैं, उनमें Id अप्रत्यक्ष रूप से मापन का संकेत दे सकता है। इसलिए आप मापन के बजाय id के लिए कॉलम चुन सकते हैं।

नीचे दिए दोनों तरीकों के परिणाम समान हैं। पहला id के लिए कॉलम चुनता है, दूसरा समेटे जाने वाले कॉलम चुनता है:

melt(babies, id.vars=c("name","gender"))

melt(babies, measure.vars = c("year2011", "year2012", "year2013"))

##             name gender variable  value
## 1  Jackson Smith      M year2011  74.69
## 2  Emma Williams      F year2011     NA
## 3     Liam Brown      M year2011  88.24
## 4     Ava Wilson      F year2011  88.77
## 5  Jackson Smith      M year2012  84.99
## 6  Emma Williams      F year2012     NA
## 7     Liam Brown      M year2012     NA
## 8     Ava Wilson      F year2012  96.45
## 9  Jackson Smith      M year2013  91.73
## 10 Emma Williams      F year2013  75.74
## 11    Liam Brown      M year2013 101.83
## 12    Ava Wilson      F year2013     NA

यदि आप दोनों id.vars और measure.vars निर्दिष्ट करते हैं, तो जो कॉलम इनमें शामिल नहीं हैं वे परिणाम से बाहर हो जाते हैं। उदाहरण के लिए, नीचे के कोड अंश को देखें:

melt(babies, id.vars=c("name"), measure.vars=c("year2011", "year2012"))

##            name variable value
## 1 Jackson Smith year2011 74.69
## 2 Emma Williams year2011    NA
## 3    Liam Brown year2011 88.24
## 4    Ava Wilson year2011 88.77
## 5 Jackson Smith year2012 84.99
## 6 Emma Williams year2012    NA
## 7    Liam Brown year2012    NA
## 8    Ava Wilson year2012 96.45

इसके अलावा, na.rm=T NA मानों को हटा सकता है:

melt(babies, id.vars=c("name"), measure.vars=c("year2011", "year2012"), na.rm=T)

##            name variable value
## 1 Jackson Smith year2011 74.69
## 3    Liam Brown year2011 88.24
## 4    Ava Wilson year2011 88.77
## 5 Jackson Smith year2012 84.99
## 8    Ava Wilson year2012 96.45

dcast() फ़ंक्शन melt() का उल्टा काम करता है। id, variable, और value सबसे लंबे-रूप के कॉलम हैं। dcast(data, id ~ variable, value.var="value") सबसे लंबे-रूप को चौड़े-रूप में ले जाता है।

babiesLong <- melt(babies, id.vars=c("name"), measure.vars=c("year2011", "year2012"), na.rm=T)
babiesLong

##            name variable value
## 1 Jackson Smith year2011 74.69
## 3    Liam Brown year2011 88.24
## 4    Ava Wilson year2011 88.77
## 5 Jackson Smith year2012 84.99
## 8    Ava Wilson year2012 96.45

babiesLong में id के लिए name, variable के लिए variable, और value के लिए value है। इसलिए आप dcast() का उपयोग करके इसे चौड़े-रूप में बदल सकते हैं:

dcast(babiesLong, name ~ variable, value.var="value")

##            name year2011 year2012
## 1    Ava Wilson    88.77    96.45
## 2 Jackson Smith    74.69    84.99
## 3    Liam Brown    88.24       NA

निष्कर्ष

यही लगभग सब है। इस ट्यूटोरियल में, आपने डेटा को रेशेप करने के तर्क और प्रक्रिया को समझने पर ध्यान केंद्रित किया। आमतौर पर, विश्लेषण के लिए लंबे-रूप को प्राथमिकता दी जाती है, लेकिन अपवाद भी होते हैं। उपयुक्त स्थितियों में चौड़े-रूप में डेटा प्रस्तुत करना जगह बचा सकता है, पर जैसे-जैसे लापता मानों की संख्या बढ़ती है, आपको लंबे-रूप में बदल लेना चाहिए।

फ़ॉर्मेट रूपांतरण के लिए, आपको इस पर ध्यान देना होगा कि मापन क्या हैं। लंबे-रूप का सूत्र है: एक पंक्ति में एक मापन; और चौड़े-रूप में एक पंक्ति में कई मापन होते हैं। जब आप जिन कॉलमों में मापन फैले हैं उन्हें एक कॉलम में समेटते हैं, तो मूल कॉलम नामों को एक अतिरिक्त कॉलम में सुरक्षित रखना आवश्यक होता है। जब आप एक कॉलम में मौजूद मापों को अलग-अलग कॉलमों में फैलाते हैं, तो आपको variable कॉलम से तय करना होता है कि कॉलम नाम क्या होने चाहिए।

एक बार जब आप इस प्रक्रिया को समझ लेते हैं, तो dcast() और melt() जैसे फ़ंक्शनों का उपयोग बहुत आसान हो जाता है!

विषय