2012-08-07 19 views
6

Ich versuche, eine Tabelle zu replizieren, die oft in der offiziellen Statistik verwendet wird, aber bisher keinen Erfolg. Bei einem Datenrahmen wie diese:Häufigkeitstabelle mit mehreren Variablen in R

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) 

Ich mag würde eine Tabelle zeigt pro Jahr, die Zahl aller Studenten (alle) und diejenigen, die weiblich sind zu schaffen, diejenigen, die teilgenommen haben und diejenigen, die übergeben. Bitte beachten Sie, "davon" bezieht sich auf alle Studenten.

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]) 

auf diese Art der Sache in R. Ich bin sicher, dass es einen besseren Weg

Hinweis:

Eine Tabelle I im Sinn haben wie das aussehen würde, ich habe gesehen, LaTex Lösungen, aber ich benutze das nicht, das wird für mich funktionieren, da ich die Tabelle in Excel exportieren muss.

Vielen Dank im Voraus

Antwort

8

Mit plyr:

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

Welche gibt:

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

danke. Danke vielmals. Ich werde definitiv plyr lernen. – user1043144

+0

Gute Antwort, aber eine Minute später als @csgillespie. –

+0

@Jilber, ich glaube du meintest * eine Minute früher *. Es sollte kein "aber" in Ihrem Kommentar geben. – A5C1D2H2I1M1N2O1R2T1

4

Das ist für diese Art der Sache plyr Paket. Erste Last das Paket

library(plyr) 

Dann verwenden wir die ddply Funktion:

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")) 

Grundsätzlich erwartet ddply einen Datenrahmen als Eingabe und gibt einen Datenrahmen. Wir teilen dann den Eingabedatenrahmen durch ExamenYear auf. Auf jeder Untertabelle berechnen wir einige zusammenfassende Statistiken. Beachten Sie, dass wir in ddply die $ Schreibweise nicht verwenden müssen, wenn Sie auf Spalten verweisen.

+0

Danke. ihr habt beide meinen Tag gemacht – user1043144

4

Es könnte ein paar Änderungen war (with verwenden, um die Anzahl der df$ Anrufe zu reduzieren und Zeichenindizes verwendet Selbstdokumentation zu verbessern), um Ihren Code, die es einfacher und einen würdigen Konkurrenten zum ddply lesen gemacht hätten Lösungen:

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 

ich würde erwarten, dass dies viel schneller als die ddply Lösung sein, aber das ist nur offensichtlich sein wird, wenn Sie größere Datenmengen arbeiten.

1

Sie können auch einen Blick von der plyr nächsten Iterator nehmen wollen: dplyr

Es verwendet eine ggplot-ähnliche Syntax und schnelle Performance bieten, indem wichtige Stücke in C++ zu schreiben.

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