आर

2012-08-07 2 views
6

में कई चर के साथ आवृत्ति तालिका मैं आधिकारिक आंकड़ों में अक्सर उपयोग की जाने वाली तालिका को दोहराने की कोशिश कर रहा हूं लेकिन अब तक कोई सफलता नहीं है। इस तरह का dataframe को देखते हुए:आर

d1 <- data.frame(StudentID = c("x1", "x10", "x2", 
          "x3", "x4", "x5", "x6", "x7", "x8", "x9"), 
      StudentGender = c('F', 'M', 'F', 'M', 'F', 'M', 'F', 'M', 'M', 'M'), 
      ExamenYear = c('2007','2007','2007','2008','2008','2008','2008','2009','2009','2009'), 
      Exam   = c('algebra', 'stats', 'bio', 'algebra', 'algebra', 'stats', 'stats', 'algebra', 'bio', 'bio'), 
      participated = c('no','yes','yes','yes','no','yes','yes','yes','yes','yes'), 
      passed  = c('no','yes','yes','yes','no','yes','yes','yes','no','yes'), 
      stringsAsFactors = FALSE) 

मैं प्रति वर्ष दिखा एक तालिका बनाने के लिए करना चाहते हैं, सभी छात्रों (सभी) और जो महिला हैं, जो उन लोगों के भाग लिया और जो लोग पारित कर दिया की संख्या। कृपया ध्यान दें "नीचे" सभी छात्रों को संदर्भित करता है।

एक तालिका मैं मन में है कि ऐसा दिखाई देगा:

cbind(All = table(d1$ExamenYear), 
    participated  = table(d1$ExamenYear, d1$participated)[,2], 
    ofwhichFemale  = table(d1$ExamenYear, d1$StudentGender)[,1], 
    ofwhichpassed  = table(d1$ExamenYear, d1$passed)[,2]) 

मुझे यकीन है कि वहाँ आर

में बात इस तरह का

नोट करने के लिए एक बेहतर तरीका है कर रहा हूँ: मैं लेटेक्स के समाधान को देखा है, लेकिन मैं इसका उपयोग नहीं करूँगा यह मेरे लिए काम करेगा क्योंकि मुझे एक्सेल में टेबल निर्यात करने की आवश्यकता है।

अग्रिम

उत्तर

8

धन्यवाद plyr का उपयोग करना:

require(plyr) 
ddply(d1, .(ExamenYear), summarize, 
     All=length(ExamenYear), 
     participated=sum(participated=="yes"), 
     ofwhichFemale=sum(StudentGender=="F"), 
     ofWhichPassed=sum(passed=="yes")) 

कौन देता है:

ExamenYear All participated ofwhichFemale ofWhichPassed 
1  2007 3   2    2    2 
2  2008 4   3    2    3 
3  2009 3   3    0    2 
+0

धन्यवाद। बहुत बहुत धन्यवाद। मैं निश्चित रूप से प्लीयर सीखने जा रहा हूँ। – user1043144

+0

अच्छा जवाब लेकिन @csgillespie से एक मिनट बाद। –

+0

@ जिलबर, मुझे लगता है कि आपका मतलब था * एक मिनट पहले *। आपकी टिप्पणी में कोई "लेकिन" नहीं होना चाहिए। – A5C1D2H2I1M1N2O1R2T1

4

plyr पैकेज बात की इस तरह के लिए अच्छा है।

ddply(d1, "ExamenYear", summarise, 
     All = length(passed),##We can use any column for this statistics 
     participated = sum(participated=="yes"), 
     ofwhichFemale = sum(StudentGender=="F"), 
     ofwhichpassed = sum(passed=="yes")) 

असल में, ddply इनपुट के रूप में एक dataframe अपेक्षा करता है और एक डेटा फ़्रेम लौटाता है: सबसे पहले लोड पैकेज

library(plyr) 

फिर हम ddply समारोह का उपयोग करें। फिर हम ExamenYear द्वारा इनपुट डेटा फ्रेम को विभाजित करते हैं। प्रत्येक उप तालिका पर हम कुछ सारांश आंकड़ों की गणना करते हैं। ध्यान दें कि ddply में, कॉलम का जिक्र करते समय हमें $ नोटेशन का उपयोग करने की आवश्यकता नहीं है।

+0

धन्यवाद। तुम दोनों ने मेरा दिन बनाया – user1043144

4

वहाँ हो सकता था संशोधनों (का उपयोग withdf$ कॉल की संख्या को कम करने और चरित्र सूचकांकों का उपयोग स्वयं प्रलेखन में सुधार करने के लिए) अपने कोड है कि ddply करने के लिए इसे पढ़ने में आसान बना सकता था और एक योग्य प्रतियोगी के एक जोड़े समाधान:

with(d1, cbind(All = table(ExamenYear), 
    participated  = table(ExamenYear, participated)[,"yes"], 
    ofwhichFemale  = table(ExamenYear, StudentGender)[,"F"], 
    ofwhichpassed  = table(ExamenYear, passed)[,"yes"]) 
    ) 

    All participated ofwhichFemale ofwhichpassed 
2007 3   2    2    2 
2008 4   3    2    3 
2009 3   3    0    2 

मैं इस ddply समाधान की तुलना में बहुत तेजी से होने की अपेक्षा करेंगे, हालांकि यह है कि केवल स्पष्ट यदि आप बड़े डेटासेट पर काम कर रहे हो जाएगा।

1

तुम भी plyr की अगली इटरेटर का एक बार देख ले सकते हैं: dplyr

यह एक ggplot की तरह सिंटैक्स का उपयोग करता है और सी में महत्वपूर्ण हिस्सों को लिखने ++ द्वारा तेजी से प्रदर्शन प्रदान करते हैं।

d1 %.% 
group_by(ExamenYear) %.%  
summarise(ALL=length(ExamenYear), 
      participated=sum(participated=="yes"), 
      ofwhichFemale=sum(StudentGender=="F"), 
      ofWhichPassed=sum(passed=="yes"))