2011-10-19 14 views
45

मैं इस तरह विशाल dataframe है:पुनर्व्यवस्थित एक मेज के dataframe, के विपरीत "पिघल"

SN = c(1:100, 1:100, 1:100, 1:100) 
class = c(rep("A1", 100), rep("B2", 100), rep("C3", 100), rep("D4", 100)) # total 6000 levels 
myvar = rnorm(400) 
mydf = data.frame(SN, class, myvar) 

मैं चाहता हूँ करने के लिए भरा में एकल स्तंभ और myVar के रूप में प्रत्येक स्तर के साथ एक तालिका में "unmelt":

SN   A1   B2   C3   D4  .............and so on for all 6000 

मैं इसे कैसे प्राप्त कर सकता हूं, मुझे पता है कि यह आसान सवाल है, लेकिन मुझे पता नहीं लगा सका।

+2

पैकेज में 'रीटेल 2' 'पिघल' के विपरीत 'कास्ट' – Andrie

+0

सुझावों के लिए धन्यवाद, आवश्यकता (reshape2); एकास्ट (mydf, myvar ~ class) ने आभासी परिणाम – jon

+0

सही वाक्यविन्यास के लिए नीचे उत्तर देखें। इसे दो बार उपयोग करने के बाद यह वास्तव में काफी प्राकृतिक है। अंतर्निहित 'reshape() 'से काफी बेहतर है। –

उत्तर

47
> dcast(mydf, SN ~ class) 

    SN   A1   B2   C3   D4 
1 1 0.1461258 0.8325014 0.33562088 -0.07294576 
2 2 0.5964182 0.4593710 -0.23652803 -1.52539568 
3 3 2.0247742 -1.1235963 1.79875447 -1.87462227 
4 4 0.8184004 1.3486721 0.76076486 -1.18311991 
5 5 -0.6577212 0.3666741 -0.06057506 1.38825487 
6 6 0.1590443 0.2043661 0.08161778 0.10421797 
... 
+10

नोट: यह 'reshape2' लाइब्रेरी से है। –

+2

यह भी ध्यान दें कि "सर्वश्रेष्ठ अभ्यास" होगा: dcast (mydf, sN ~ class, value.var = "myvar") – pallevillesen

+0

उम, क्या यह काम करना चाहिए? 'iris_melt <- पिघला (आईरिस); dcast (iris_melt, प्रजाति ~ परिवर्तनीय) '? क्योंकि यह नहीं करता है। यह मायने रखता है (मापन तालिका द्वारा एक प्रजाति)। – naught101

5
molten = melt(mydf , id.vars = c("SN" , "class") , measure.vars = "myvar") 
casted = dcast(molten , SN~class) 
1

आधार आर में आप इसे इस तरह कर सकता है ...

# get it sorted so that all you need to do is make a matrix out of it 
mydf <- mydf[order(mydf$class, mydf$SN),] 
# save the unique values of SN 
SNu <- unique(mydf$SN) 
# combine a matrix with SN 
mydfw <- data.frame(SNu, matrix(mydf$myvar, nrow = length(SNu))) 
# name your columns  
colnames(mydfw) <- c('SN', levels(mydf$class)) 

या, अधिक संक्षिप्त अभिव्यक्ति के लिए split साथ कुल

aggregate(myvar~SN, mydf, 'c') 
# column names don't come out great 
colnames(mydfw) <- c('SN', levels(mydf$class)) 
+1

यह मानता है कि स्तर के सभी संयोजन मौजूद हैं, जो सामान्य रूप से, एक खतरनाक धारणा है। – hadley

+0

यह उदाहरण के लिए काम करता है। आपको बस पहले पसंद नहीं है क्योंकि यह बहुत तेज़ है। :) लेकिन एक तरफ मजाक कर, प्रश्नकर्ता, हैडली सही है, अगर आपके पास पूर्ण मैट्रिक्स नहीं है तो यह सही तरीके से काम नहीं करेगा। आप ब्याज के कारकों के लिए expand.grid का उपयोग कर एक पूर्ण फैक्टोरियल डिज़ाइन के साथ विलय कर सकते हैं। – John

1

एक और दृष्टिकोण का उपयोग कर:

mydfSplit <- split(mydf[,-2], mydf$class, drop=TRUE) 

परिणाम एक सूची है जो आसानी से एक data.frame में बदला जा सकता घटक है, तो है ही आयाम (जो इस उदाहरण में सच है):

mydf2 <- do.call(cbind, mydfSplit) 

इस समाधान के साथ समस्या यह है कि के नाम है अंतिम परिणाम की सफाई की जरूरत है। हालांकि, अधिक सामान्य डेटा के लिए, यह उपयोगी हो सकता है यदि SN प्रत्येक वर्ग के लिए अलग है।

संबंधित मुद्दे