2010-01-14 12 views
17

में डेटा फ्रेम का उपयोग करने के मैं एक Monte-Carlo सिमुलेशन चल रहा हूँ है और उत्पादन रूप में है:मैं हमेशा ggplot2

> d = data.frame(iter=seq(1, 2), k1 = c(0.2, 0.6), k2=c(0.3, 0.4)) 
> d 
iter k1 k2 
1  0.2 0.3 
2  0.6 0.4 

भूखंडों मैं तैयार करना चाहता है:

plot(d$iter, d$k1) 
plot(density(d$k1)) 

मैं, ggplot2 का उपयोग कर बराबर भूखंडों कैसे करना डेटा फ्रेम में बदलने का

new_d = data.frame(iter=rep(d$iter, 2), 
        k = c(d$k1, d$k2), 
        label = rep(c('k1', 'k2'), each=2)) 

तो साजिश रचने के लिए आसान है। हालांकि पुनरावृत्तियों की संख्या बहुत बड़ी हो सकती है और के की संख्या भी बड़ी हो सकती है। इसका मतलब है कि एक बहुत बड़े डेटा फ्रेम के साथ गड़बड़ाना।

क्या वैसे भी मैं इस नए डेटा फ्रेम को बनाने से बच सकता हूं?

धन्यवाद

उत्तर

13

संक्षिप्त उत्तर "नहीं," आप डेटा फ्रेम बनाने से नहीं बच सकते हैं। ggplot डेटा को डेटा फ्रेम में होने की आवश्यकता है। आप qplot का उपयोग करते हैं, तो आप इसे x और y के लिए अलग वैक्टर दे सकते हैं, लेकिन आंतरिक रूप से, यह अभी भी मानकों आप में पास के बाहर एक डेटा फ्रेम बनाने है

मैं जुबा के सुझाव से सहमत -। reshape समारोह उपयोग करने का तरीका , या पैकेज melt/cast फ़ंक्शंस के साथ अभी तक बेहतर है। एक बार जब आप अपने डेटा को लंबे प्रारूप में डालकर तेजी से प्राप्त कर लेते हैं, तो अद्भुत ggplot ग्राफ़ बनाना एक कदम आगे हो जाता है!

4

आप "लंबे" प्रारूप करने के लिए अपने डेटा फ्रेम को बदलने के लिए reshape फ़ंक्शन का उपयोग कर सकते हैं। हो सकता है कि यह आपके कोड से थोड़ा तेज हो?

R> reshape(d, direction="long",varying=list(c("k1","k2")),v.names="k",times=c("k1","k2")) 
    iter time k id 
1.k1 1 k1 0.2 1 
2.k1 2 k1 0.6 2 
1.k2 1 k2 0.3 1 
2.k2 2 k2 0.4 2 
2

तो बस पिछले उत्तरों में जोड़ने के लिए। Qplot के साथ आप

p <- qplot(y=d$k2, x=d$k1) 

और फिर वहां से इसे और बना सकते हैं, उदाहरण के लिए

p + theme_bw() 

लेकिन मैं सहमत हूं - पिघला/कास्ट जीनरल रूप से आगे बढ़ रहा है।