2011-11-19 18 views
11

मुझे पता है कि यहां "लंबे समय तक" के रूब्रिक के तहत कई बार पूछा गया है, लेकिन मैंने ऐसी परिस्थिति में भाग लिया है जहां मेरे पास दो मान चर हैं जो दोहराए गए उपाय हैं।लंबे समय तक विस्तृत w/दो दोहराए गए उपायों

  id sex time  score1 score2 
1 subject 1 m Time1 -0.20926263 0.2499310 
2 subject 2 m Time1 0.17147511 3.2708905 
3 subject 3 m Time1 -0.82619584 0.5993917 
4 subject 4 f Time1 -0.95568823 4.4729726 
5 subject 5 f Time1 -2.29939525 8.0101254 
6 subject 1 m Time2 -0.37914702 3.6387589 
7 subject 2 m Time2 0.26759909 4.9027533 
8 subject 3 m Time2 0.07727621 2.1848642 
9 subject 4 f Time2 -0.08613439 5.8747074 
10 subject 5 f Time2 -0.02743044 4.3963938 
11 subject 1 m Time3 0.07176053 3.7959496 
12 subject 2 m Time3 0.46463917 5.2494579 
13 subject 3 m Time3 -0.68764512 2.2639503 
14 subject 4 f Time3 -0.56670061 2.3361909 
15 subject 5 f Time3 1.70731774 5.8345116 

डेटा फ्रेम (डीएफ) को पुन: पेश करने का त्वरित तरीका।

DF<-data.frame(id=rep(paste("subject", 1:5, sep=" "), 3),    
       sex=rep(c("m","m","m","f","f"), 3),      
       time=c(rep("Time1",5), rep("Time2",5), rep("Time3",5)), 
       score1=rnorm(15), score2=abs(rnorm(15)*4))    

मैं दो मापा जाता दोहराया उपाय आधार से reshape समारोह का उपयोग कर चर के लिए विस्तृत करने के लिए लंबे समय तक के मुद्दे को हल कर सकते हैं, लेकिन मैं एक plyr या reshape2/1 जवाब के लिए उम्मीद कर रहा था के रूप में इन पैकेजों आम तौर पर और अधिक मेरे लिए सहज ज्ञान युक्त हैं। यदि आपके पास कोई अन्य समाधान आगे बढ़ता है और उन्हें प्रदान करता है क्योंकि सीखना बहुत अच्छा होगा। आधार से

समाधान:

wide <- reshape(DF, v.names=c("score1", "score2"), idvar="id",   
       timevar="time", direction="wide")      
wide 
+1

? मैं नहीं देखता कि करीब ("विषय बंद") वोट क्या था ...? –

+1

बेन ने इसे रीशेप और ऐसे छोटे कोड के साथ खींचा। मैं अन्य विधियों के लिए बहुत खुला हूं (सुनिश्चित नहीं है कि डेटाटेबल आदि के साथ यह कैसे करें/कैसे करें) –

उत्तर

12

मुझे लगता है कि यह यह करना होगा:

library(reshape) 
m <- melt(DF) 

सरल है, लेकिन समय और स्कोर अपने उदाहरण से विपरीत क्रम में कर रहे हैं (मामले में यह मायने रखती है)

cast(m,id+sex~...) 

या अधिक स्पष्ट रूप से:

cast(m,id+sex~variable+time) 

आप इस नीचे एक एक लाइनर के लिए कटौती कर सकते हैं:

recast(DF,id+sex~...) 

क्या आप reshape के बजाय नए reshape2 पैकेज का उपयोग कर सकते हैं पसंद करते हैं, dcast (reshape2 नहीं करता है में शामिल recast के संस्करण के साथ cast की जगह वांछित परिणाम नहीं देते हैं।)

+0

पूर्णता। सीखने के अवसर के लिए धन्यवाद। –

2

बेन का उत्तर इस सवाल से पूछने की तारीख पर विचार करना बहुत अच्छा है। हालांकि, यह ध्यान दिया जाना चाहिए कि dcast फ़ंक्शन "डेटा.table" के हाल के संस्करणों में शामिल है, इस तरह की समस्याओं को पहले melt डेटा के बिना संभाल सकता है। इस प्रकार, यह उपयोग करने के लिए एक और अधिक कुशल दृष्टिकोण होगा।

library(data.table) 
dcast(as.data.table(DF), id + sex ~ time, value.var = c("score1", "score2")) 
##   id sex score1_Time1 score1_Time2 score1_Time3 score2_Time1 score2_Time2 score2_Time3 
## 1: subject 1 m 0.78213630 -0.1557955 -0.10278773 1.5771598  1.013447 1.4583278 
## 2: subject 2 m 0.07456498 -1.4707524 0.38767161 0.2372536  2.787854 3.0741317 
## 3: subject 3 m -1.98935170 -0.4781501 -0.05380504 4.4001015  2.226653 0.4493848 
## 4: subject 4 f 0.61982575 0.4179416 -1.37705956 3.0527030  2.755023 3.5244309 
## 5: subject 5 f -0.05612874 1.3586796 -0.41499456 0.6580944  2.829981 1.5924235 
संबंधित मुद्दे