R Language
लंबी और चौड़ी रूपों के बीच डेटा को फिर से आकार देना
खोज…
परिचय
आर में, सारणीबद्ध डेटा को डेटा फ़्रेम में संग्रहीत किया जाता है। यह विषय एकल तालिका को बदलने के विभिन्न तरीकों को शामिल करता है।
टिप्पणियों
सहायक पैकेज
- डेटा के साथ Reshaping, स्टैकिंग और विभाजन
- Tidyr का उपयोग करके रीसेट करें
- splitstackshape
फेरबदल समारोह
डेटा को reshape
करने के लिए सबसे लचीला बेस आर फ़ंक्शन है। इसके सिंटैक्स के लिए देखें ?reshape
# create unbalanced longitudinal (panel) data set
set.seed(1234)
df <- data.frame(identifier=rep(1:5, each=3),
location=rep(c("up", "down", "left", "up", "center"), each=3),
period=rep(1:3, 5), counts=sample(35, 15, replace=TRUE),
values=runif(15, 5, 10))[-c(4,8,11),]
df
identifier location period counts values
1 1 up 1 4 9.186478
2 1 up 2 22 6.431116
3 1 up 3 22 6.334104
5 2 down 2 31 6.161130
6 2 down 3 23 6.583062
7 3 left 1 1 6.513467
9 3 left 3 24 5.199980
10 4 up 1 18 6.093998
12 4 up 3 20 7.628488
13 5 center 1 10 9.573291
14 5 center 2 33 9.156725
15 5 center 3 11 5.228851
ध्यान दें कि data.frame असंतुलित है, अर्थात, यूनिट 2 पहली अवधि में एक अवलोकन याद कर रहा है, जबकि इकाइयों 3 और 4 दूसरी अवधि में अवलोकन गायब हैं। इसके अलावा, ध्यान दें कि दो चर हैं जो अवधि में भिन्न होते हैं: मायने रखता है और मूल्य, और दो जो भिन्न नहीं होते हैं: पहचानकर्ता और स्थान।
लंबा चौड़ा
डेटा को फिर से आकार देने के लिए। विस्तृत प्रारूप में,
# reshape wide on time variable
df.wide <- reshape(df, idvar="identifier", timevar="period",
v.names=c("values", "counts"), direction="wide")
df.wide
identifier location values.1 counts.1 values.2 counts.2 values.3 counts.3
1 1 up 9.186478 4 6.431116 22 6.334104 22
5 2 down NA NA 6.161130 31 6.583062 23
7 3 left 6.513467 1 NA NA 5.199980 24
10 4 up 6.093998 18 NA NA 7.628488 20
13 5 center 9.573291 10 9.156725 33 5.228851 11
ध्यान दें कि लापता समय अवधि NA के साथ भरी हुई है।
व्यापक फेरबदल में, "v.names" तर्क उन स्तंभों को निर्दिष्ट करता है जो समय के साथ बदलते हैं। यदि स्थान चर आवश्यक नहीं है, तो इसे "ड्रॉप" तर्क के साथ पुन: आकार देने से पहले गिराया जा सकता है। Data.frame से एकमात्र गैर-अलग / गैर-आईडी कॉलम छोड़ने में, v.names तर्क अनावश्यक हो जाता है।
reshape(df, idvar="identifier", timevar="period", direction="wide",
drop="location")
वाइड टू लॉन्ग
वर्तमान df.wide के साथ लंबे समय तक फेरबदल करने के लिए, एक न्यूनतम वाक्यविन्यास है
reshape(df.wide, direction="long")
हालांकि, यह आमतौर पर मुश्किल है:
# remove "." separator in df.wide names for counts and values
names(df.wide)[grep("\\.", names(df.wide))] <-
gsub("\\.", "", names(df.wide)[grep("\\.", names(df.wide))])
अब सरल सिंटैक्स अपरिभाषित कॉलम के बारे में एक त्रुटि उत्पन्न करेगा।
स्तंभ नामों के साथ जो स्वचालित रूप से पार्स करने के लिए reshape
फ़ंक्शन के लिए अधिक कठिन हैं, कभी-कभी "अलग-अलग" तर्क को जोड़ना आवश्यक होता है जो परिवर्तन को लंबे प्रारूप में परिवर्तन के लिए समूह विशेष चर में reshape
को बताता है। यह तर्क चर नामों या सूचकांकों के वैक्टर की एक सूची लेता है।
reshape(df.wide, idvar="identifier",
varying=list(c(3,5,7), c(4,6,8)), direction="long")
लंबे समय तक फेरबदल में, "v.names" तर्क के परिणामस्वरूप भिन्न चर नाम बदलने के लिए प्रदान किया जा सकता है।
कभी कभी के विनिर्देश "अलग" "सितं" तर्क जो बताता है के उपयोग से बचा जा सकता reshape
चर नाम के कौन से भाग मान तर्क निर्दिष्ट करता है और जो समय तर्क निर्दिष्ट करता है।
डेटा को फिर से आकार देना
अक्सर डेटा टेबल में आता है। आम तौर पर एक व्यक्ति इस सारणीबद्ध डेटा को विस्तृत और लंबे प्रारूप में विभाजित कर सकता है। एक विस्तृत प्रारूप में, प्रत्येक चर का अपना कॉलम होता है।
व्यक्ति | ऊंचाई (सेंटिमीटर] | आयु [वर्ष] |
---|---|---|
एलिसन | 178 | 20 |
बॉब | 174 | 45 |
कार्ल | 182 | 31 |
हालांकि, कभी-कभी एक लंबा प्रारूप होना अधिक सुविधाजनक होता है, जिसमें सभी चर एक कॉलम में होते हैं और मान दूसरे कॉलम में होते हैं।
व्यक्ति | परिवर्तनशील | मूल्य |
---|---|---|
एलिसन | ऊंचाई (सेंटिमीटर] | 178 |
बॉब | ऊंचाई (सेंटिमीटर] | 174 |
कार्ल | ऊंचाई (सेंटिमीटर] | 182 |
एलिसन | आयु [वर्ष] | 20 |
बॉब | आयु [वर्ष] | 45 |
कार्ल | आयु [वर्ष] | 31 |
बेस आर, साथ ही साथ थर्ड पार्टी पैकेज का उपयोग इस प्रक्रिया को सरल बनाने के लिए किया जा सकता है। प्रत्येक विकल्प के लिए, mtcars
डेटासेट का उपयोग किया जाएगा। डिफ़ॉल्ट रूप से, यह डेटासेट लंबे प्रारूप में है। पैकेजों के काम करने के लिए, हम पहले कॉलम के रूप में पंक्ति नामों को सम्मिलित करेंगे।
mtcars # shows the dataset
data <- data.frame(observation=row.names(mtcars),mtcars)
बेस आर
बेस आर में दो कार्य हैं जिनका उपयोग विस्तृत और लंबे प्रारूप के बीच परिवर्तित करने के लिए किया जा सकता है: stack()
और unstack()
।
long <- stack(data)
long # this shows the long format
wide <- unstack(long)
wide # this shows the wide format
हालांकि, अधिक उन्नत उपयोग के मामलों के लिए ये कार्य बहुत जटिल हो सकते हैं। सौभाग्य से, तीसरे पक्ष के पैकेजों का उपयोग करने वाले अन्य विकल्प हैं।
टाइडर पैकेज
यह पैकेज चौड़े से लंबे और spread()
लिए gather()
का उपयोग करता है और लंबे से चौड़े में परिवर्तित होता है।
library(tidyr)
long <- gather(data, variable, value, 2:12) # where variable is the name of the
# variable column, value indicates the name of the value column and 2:12 refers to
# the columns to be converted.
long # shows the long result
wide <- spread(long,variable,value)
wide # shows the wide result (~data)
डेटाटेबल पैकेज
Data.table पैकेज reshape2
फ़ंक्शंस का विस्तार करता है और लंबे समय से व्यापक तक जाने के लिए फ़ंक्शन melt()
का उपयोग विस्तृत से लंबे और dcast()
में जाने के लिए करता है।
library(data.table)
long <- melt(data,'observation',2:12,'variable', 'value')
long # shows the long result
wide <- dcast(long, observation ~ variable)
wide # shows the wide result (~data)