2011-03-13 30 views
8

यह डेटा विश्लेषण में एक मूल समस्या है जो स्टेटा एक चरण में संबंधित है।एकाधिक चर के साथ विस्तृत पैनल से डेटा फ्रेम को दोबारा बदलें और कुछ समय परिवर्तक

d1 <- data.frame(subject = c("id1", "id2"), 
x0 = c("male", "female"), 
x1_2000 = 1:2, 
x1_2005 = 5:6, 
x2_2000 = 1:2, 
x2_2005 = 5:6  
) 

s.t.:

वर्ष 2000 और 2005 (x1, x2) के लिए समय अपरिवर्तनीय डेटा (x0) और समय अलग-अलग डेटा के साथ एक विस्तृत डेटा फ्रेम बनाएं

subject x0 x1_2000 x1_2005 x2_2000 x2_2005 
1  id1 male   1  5  1  5 
2  id2 female  2  6  2  6 

मैं एक पैनल है जैसे कि यह आकार देने के लिए चाहते हैं, ताकि डेटा इस तरह दिखता है:

 subject  x0 time x1 x2 
1  id1 male 2000 1 1 
2  id2 female 2000 2 2 
3  id1 male 2005 5 5 
4  id2 female 2005 6 6 

मैं reshape s.t. साथ ऐसा कर सकते

d2 <-reshape(d1, 
idvar="subject", 
varying=list(c("x1_2000","x1_2005"), 
    c("x2_2000","x2_2005")), 
    v.names=c("x1","x2"), 
    times = c(2000,2005), 
    direction = "long", 
    sep= "_") 

मेरी मुख्य चिंता यह है कि जब आपके पास उपरोक्त कमांड के दर्जनों चर होते हैं तो बहुत लंबा होता है। stata में एक बस टाइप करेंगे:

reshape long x1 x2, i(subject) j(year) 

वहाँ आर में इस तरह के एक सरल उपाय है?

library(reshape2) 
library(stringr) 

# it is always useful to start with melt 
d2 <- melt(d1, id=c("subject", "x0")) 

# redefine the time and x1, x2, ... separately 
d2 <- transform(d2, time = str_replace(variable, "^.*_", ""), 
        variable = str_replace(variable, "_.*$", "")) 

# finally, cast as you want 
d3 <- dcast(d2, subject+x0+time~variable) 

अब आप भी निर्दिष्ट करने x1 और x2 की जरूरत नहीं है:

उत्तर

12

reshape अपने तर्कों के कई अनुमान लगा सकते हैं:
इस कोड को यदि चर वृद्धि काम करता है। इस मामले में निम्नलिखित निर्दिष्ट करने के लिए पर्याप्त है। कोई पैकेज उपयोग नहीं किया जाता है।

reshape(d1, dir = "long", varying = 3:6, sep = "_") 

दे रही है:

 subject  x0 time x1 x2 id 
1.2000  id1 male 2000 1 1 1 
2.2000  id2 female 2000 2 2 2 
1.2005  id1 male 2005 5 5 1 
2.2005  id2 female 2005 6 6 2 
+0

अच्छा! लेकिन क्या होता है जब चर का नाम _sample_1_2000_ आदि रखा जाता है ... क्या कोई 'sep = 'विकल्प के साथ अधिक spjhisticated हो सकता है? – Fred

+2

@ फ्रेड, 'सीपीपी 'के स्थान पर' विभाजन 'तर्क का प्रयोग करें, यानी' reshape (d1, dir =" long ", भिन्न = 3: 6, विभाजन = सूची (regexp =" _2 ", = TRUE शामिल करें) 'या इस मामले को प्रश्न में एक को कम करें, यानी' reshape (setNames (d1, sub ("sample_", "", नाम (d1))), dir = "long", भिन्न = 3: 6, sep = "_") ' –

4

यहाँ एक संक्षिप्त उदाहरण reshape2 पैकेज का उपयोग है।

> d1 <- data.frame(subject = c("id1", "id2"), x0 = c("male", "female"), 
+ x1_2000 = 1:2, 
+ x1_2005 = 5:6, 
+ x2_2000 = 1:2, 
+ x2_2005 = 5:6, 
+ x3_2000 = 1:2, 
+ x3_2005 = 5:6, 
+ x4_2000 = 1:2, 
+ x4_2005 = 5:6 
+) 
> 
> d2 <- melt(d1, id=c("subject", "x0")) 
> d2 <- transform(d2, time = str_replace(variable, "^.*_", ""), 
+      variable = str_replace(variable, "_.*$", "")) 
> 
> d3 <- dcast(d2, subject+x0+time~variable) 
> 
> d3 
    subject  x0 time x1 x2 x3 x4 
1  id1 male 2000 1 1 1 1 
2  id1 male 2005 5 5 5 5 
3  id2 female 2000 2 2 2 2 
4  id2 female 2005 6 6 6 6 
+0

धन्यवाद, यह उपयोगी है। 'ट्रांसफॉर्म' क्या कर रहा है (सहायता फ़ाइल बहुत उपयोगी नहीं है) और न ही^^ * _ "' और '" _। * $ "' की व्याख्या कैसे करें, यह स्पष्ट नहीं है। मैं पूछता हूं क्योंकि कुछ वर्रों को वास्तव में "sample_1_2000" नाम दिया गया है ... – Fred

+0

शायद यह "sample_1_2000" नामक वर्ष के डेटा के साथ अधिक सहज है और इसी प्रकार: 'temp1 <- transform (temp, time = str_sub (variable, -4), परिवर्तनीय = str_sub (चर, 1, str_length (चर) -5)) ' – Fred

+0

@ फ्रेड यह परिवर्तनीय नाम के प्रारूप पर निर्भर करता है। यदि लंबाई (कम से कम कुछ भाग) की लंबाई तय की जाती है, तो आपका रास्ता आसान है। अन्यथा, नियमित अभिव्यक्ति अधिक लचीला है। – kohske