2012-08-07 17 views
6

Próbuję replikować tabelę często używaną w oficjalnych statystykach, ale jak dotąd nie udało się jej osiągnąć. Biorąc pod uwagę dataframe jak ten:Tabela częstotliwości z wieloma zmiennymi w 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) 

Chciałbym utworzyć tabelę rocznie, liczba wszystkich studentów (wszystkich) i tych, którzy są Kobieta, którzy uczestniczyli i tych, którzy przechodzili. Uwaga "poniżej" odnosi się do wszystkich studentów.

Tabela mam w głowie będzie wyglądać tak:

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

Jestem pewien, że istnieje lepszy sposób na tego typu rzeczy w R.

Uwaga: Widziałem rozwiązań lateks, ale nie używam tego, to zadziała dla mnie, ponieważ muszę wyeksportować tabelę w Excelu.

góry dzięki

Odpowiedz

8

Korzystanie plyr:

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

co daje:

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

dziękuję. Wielkie dzięki. Zdecydowanie zamierzam się uczyć plyr. – user1043144

+0

Dobra odpowiedź, ale minutę później niż @csgillespie. –

+0

@Jilber, myślę, że chodziło Ci o * minutę wcześniej *. W twoim komentarzu nie powinno być "ale". – A5C1D2H2I1M1N2O1R2T1

4

Pakiet plyr jest dobre dla tego rodzaju rzeczy. Pierwszy ładunek pakiet

library(plyr) 

Następnie używamy ddply funkcję:

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

Zasadniczo ddply spodziewa się dataframe jako wejście i zwraca ramkę danych. Następnie podzieliliśmy ramkę danych wejściowych na ExamenYear. Na każdej pod-tabeli obliczamy kilka statystyk podsumowujących. Zauważ, że w ddply, nie musimy używać notacji $ w odniesieniu do kolumn.

+0

Dzięki. oboje złożyliście mój dzień – user1043144

4

Nie mogło być kilka modyfikacji (użyć with do zmniejszenia liczby df$ połączeń i używać indeksów znaków w celu poprawienia własnej dokumentacji) do kodu, który uczyniłby to łatwiejsze do odczytania i godnym konkurentem dla ddply rozwiązania:

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 

Spodziewam się, że jest to o wiele szybciej niż ddply rozwiązania, mimo że będą widoczne tylko wtedy, gdy pracują na większych zbiorów danych.

1

Można też wziąć wygląd plyr w następnym iterator: dplyr

Używa składni ggplot-jak i zapewnić wysoką wydajność pisząc kluczowych elementów w C++.

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