2012-01-25 17 views
5

पर पैनल डेटा वाइड प्रारूप को दोबारा बदलें, मैं एक पैनल डेटासेट के व्यापक रूप से लंबे प्रारूप से परिवर्तन के साथ संघर्ष कर रहा हूं। डेटासेट इस तरह दिखता है:लांग प्रारूप

ID | KP1_430a | KP1_430b | KP1_430c | KP2_430a | KP2_430b | KP2_430c | KP1_1500a | ... 
1  .... 
2  .... 

केपी 1; केपी 2 केपी 7 तक लहरों का वर्णन करता है। ए, बी तक एक विशिष्ट आइटम का वर्णन करने के लिए बी। (उदा। पार्टी के बाएं से दाएं दाएं प्लेसमेंट ए)

मैं इस डेटा को लंबे प्रारूप में रखना चाहता हूं। इस तरह:

ID | Party | Wave | 430 | 1500 
1  1  1  .. .. 
1  2  1  .. .. 
.  .  .   
1  1  2  .. .. 
.  .  .   
2  1  1  .. .. 

मैंने reshape फ़ंक्शन का उपयोग करने का प्रयास किया। लेकिन मुझे समय के साथ-साथ पार्टियों के साथ-साथ इसे फिर से बदलने में समस्याएं थीं।

यहां एक छोटा डेटा है। उदाहरण उदाहरण।

data <- data.frame(matrix(rnorm(10),2,10)) 
data[,1] <- 1:2 
names(data) <- c("ID","KP1_430a" , "KP1_430b" , "KP1_430c" , "KP2_430a" , "KP2_430b ", "KP2_430c ", "KP1_1500a" ,"KP1_1500b", "KP1_1500c") 

और यह मुझे कितना दूर मिला।

data_long <- reshape(data,varying=list(names(data)[2:4],names(data)[5:7], names(data[8:10]), 
          v.names=c("KP1_430","KP2_430","KP1_1500"), 
          direction="long", timevar="Party") 

सवाल यह है कि मैं लंबे प्रारूप में समय अलग-अलग चर कैसे प्राप्त कर सकता हूं? और क्या इस डेटा को दोबारा बदलने का एक और शानदार तरीका है? उपरोक्त कोड में मुझे प्रत्येक तरंग और चर के लिए नाम (नाम (डेटा) [2: 4]) दर्ज करना होगा। इस छोटे से डेटा के साथ। फ्रेम ठीक है, लेकिन डेटासेट बहुत बड़ा है।

संपादित करें: यह परिवर्तन हाथ से कैसे किया जा सकता है: मैंने वास्तव में ऐसा किया है, जो मुझे पृष्ठ-लंबी कोड फ़ाइल के साथ छोड़ देता है।
सबसे पहले, आईडी, समय = 1 और पार्टी = 1 कॉलम के साथ बाएं केपी 1_430 ए और केपी 1_1500 ए। दूसरा क्रमशः पार्टी इंडेक्स को बदलकर, सभी पार्टियों [बी-एफ] के लिए एक ही ऑब्जेक्ट बनाते हैं, और इसे पंक्ति-वार जोड़ते हैं। बाकी लहरों [2-7] के लिए क्रमशः एक और दो कदम उठाएं, क्रमशः पार्टी और समय var बदलते हैं, और उन्हें पंक्ति-वार जोड़ते हैं।

+0

यदि आप लंबे प्रारूप में 430 और 1500 के लिए अलग कॉलम चाहते हैं तो विस्तृत स्थिति में उन शर्तों से बराबर मात्रा में डेटा होना चाहिए। आपके पास जिस तरह से है, आपके पास 1500 कॉलम में बहुत सी एनएएस होंगी ... या क्या आप इसे इस तरह से चाहते थे? – John

+0

ओह, यह शायद थोड़ा सा स्केची है। इन दो चर के लिए समान मात्रा में लहरें (1-7) और पार्टी आइटम (ए-एफ) है। तो: केपी [1-7] _430 [ए-एफ], केपी [1-7] _1500 [ए-एफ]। – lstoetze

+0

हालांकि, डेटासेट में कुछ चर के लिए (ए) केवल कुछ तरंगों के लिए डेटा है - उदा। केपी [146] _1640 [ए-एफ] या (बी) पार्टी विशिष्ट नहीं - उदा। केपी [1-7] _1490। – lstoetze

उत्तर

4

यह आमतौर पर आगे बढ़ने के लिए आसान है: के रूप में विन्सेंट सोचता है कि मूल स्तंभ नाम में पिछले लोअर केस अक्षर पार्टी है, तो आप उन नामों में पीछे वाले स्पेस और निकालने ट्रिम कर सकता है दो चरणों में: पहले अपने डेटा को "लंबा" प्रारूप में रखने के लिए melt का उपयोग करें (जब तक कि यह पहले से ही मामला न हो) और फिर टीआई को व्यापक प्रारूप में परिवर्तित करने के लिए dcast का उपयोग करें।

library(reshape2) 
library(stringr) 

# Tall format 
d <- melt(data, id.vars="ID") 

# Process the column containing wave and party 
d1 <- str_match_all( 
    as.character(d$variable), 
    "KP([0-9])_([0-9]+)([a-z])" 
) 
d1 <- do.call(rbind, d1) 
d1 <- d1[,-1] 
colnames(d1) <- c("wave", "number", "party") 
d1 <- as.data.frame(d1) 
d <- cbind(d, d1) 

# Convert to the desired format 
d <- dcast(d, ID + wave + party ~ number) 
+0

यह काम करता है! महान। धन्यवाद। – lstoetze

0

फिलहाल आपका वेव डेटा आपके परिवर्तनीय नामों में है और आपको इसे कुछ स्ट्रिंग प्रोसेसिंग के साथ निकालने की आवश्यकता है। मैं पिघल के साथ कोई परेशानी नहीं

mdat <- melt(data, id.vars="ID") 
mdat$wave=sub("KP", "", sub("_.+$", "", mdat$variable)) # remove the other stuff 
mdat 

आपका वर्णन बहुत अधूरा (अभी तक) मुझे बाहर एक "पार्टी" चर पाने के लिए शासन लगाने की के लिए है, तो शायद आप आपको लगता है कि कैसे हो सकता है दिखाने के लिए सवाल संपादित कर सकते हैं है था एक इंसान द्वारा किया .... और फिर हम कंप्यूटर को यह दिखाने के लिए कैसे दिखा सकते हैं।

संपादित करें:

mdat$var <- sub("\\s", "", (as.character(mdat$variable))) 
mdat$party=substr(mdat$var, nchar(mdat$var), nchar(mdat$var)) 
#-------------- 
> mdat 
    ID variable  value wave party  var 
1 1 KP1_430a 0.7220627 1  a KP1_430a 
2 2 KP1_430a 0.9585243 1  a KP1_430a 
3 1 KP1_430b -1.2954671 1  b KP1_430b 
4 2 KP1_430b 0.3393617 1  b KP1_430b 
5 1 KP1_430c -1.1477627 1  c KP1_430c 
6 2 KP1_430c -1.0909179 1  c KP1_430c 
<snipped output> 
संबंधित मुद्दे