frequency table with several variables in R

aggregate, frequency, r

Solution

Using `plyr`:

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

Which gives:

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

Problem

I am trying to replicate a table often used in official statistics but no success so far. Given a dataframe like this one: ``` 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) ``` I would like to create a table showing PER YEAR , the number of all students (all) and those who are female, those who participated and those who passed. Please note "ofwhich" below refers to all students. A table I have in mind would look like that: ``` 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]) ``` I am sure there is a better way to this kind of thing in R. Note: I have seen LaTex solutions, but I am not use this will work for me as I need to export the table in Excel . Thanks in advance

Original source