Tabela przestawna-jak Wyjście W R?

Piszę raport, który wymaga wygenerowania szeregu tabel przestawnych w Excelu. Chciałbym myśleć, że jest sposób, aby to zrobić w R, aby uniknąć Excela. Chciałbym wyjść jak zrzut ekranu poniżej(nazwy nauczycieli zredagowane). Z tego, co wiem, mógłbym użyć pakietu reshape do obliczenia zagregowanych wartości, ale musiałbym to zrobić kilka razy i jakoś uzyskać wszystkie dane we właściwej kolejności. W tym momencie powinienem robić to w Excelu. Czy ktoś masz jakieś sugestie lub zalecenia dotyczące pakietu? Dziękuję!

(edycja) Dane zaczynają się jako lista uczniów, ich nauczycieli, szkoły i rozwoju. Dane te są następnie agregowane, aby uzyskać listę nauczycieli ze średnim wzrostem klasy. Należy pamiętać, że nauczyciele są następnie pogrupowani według szkoły. Największym problemem, jaki przewiduję, robiąc to z R od teraz, jest to, w jaki sposób uzyskasz wiersze subtotal i total (BSA1 Total, Grand Total, itp.), ponieważ nie są one tego samego typu obserwacją, co inni? Czy po prostu ręcznie trzeba je obliczyć i spróbować je w odpowiedniej kolejności, aby pojawiły się na dole tej grupy?

przykład

Author: Community, 2011-07-12

4 answers

Oto swag na bitach obliczeniowych:

set.seed(1)
school  <- sample(c("BSA1", "BSA2", "HSA1"), 100, replace=T)
teacher <- sample(c("Tom", "Dick", "Harry"), 100, replace=T)
growth <- rnorm(100, 5, 3)

myDf <- data.frame(school, teacher, growth)

require(reshape2)

aggregate(growth ~ school + teacher, data =myDf, FUN=mean)

myDf.melt <- melt(myDf, measured="growth")
dcast(myDf.melt, school + teacher ~ ., fun.aggregate=mean, margins=c("school", "teacher"))

Nie zajmowałem się formatowaniem wyjściowym, tylko obliczaniem. Wynikowa ramka danych powinna wyglądać tak:

   school teacher       NA
1    BSA1    Dick 4.663140
2    BSA1   Harry 4.310802
3    BSA1     Tom 5.505247
4    BSA1   (all) 4.670451
5    BSA2    Dick 6.110988
6    BSA2   Harry 5.007221
7    BSA2     Tom 4.337063
8    BSA2   (all) 5.196018
9    HSA1    Dick 4.508610
10   HSA1   Harry 4.890741
11   HSA1     Tom 4.721124
12   HSA1   (all) 4.717335
13  (all)   (all) 4.886576

Ten przykład używa pakietu reshape2 do obsługi podliczników.

Myślę, że R jest właściwym narzędziem do tej pracy. Mogę całkowicie zrozumieć, że nie jestem pewien, jak zacząć od tej analizy. Kilka lat temu przyjechałem do R z Excela i na początku może być ciężko. Pozwól, że wskażę cztery wskazówki dla profesjonalistów pomóż uzyskać lepsze odpowiedzi w Stack Overflow:

1) podaj dane, nawet jeśli są symulowane: możesz zobaczyć, że symulowałem niektóre dane na początku mojej odpowiedzi. Gdybyś dostarczył tę symulację, miałbyś a) zaoszczędziłby mi czas b) dał ci odpowiedź, która wykorzystałaby twoją własną strukturę danych, a nie taką, którą sobie wymarzyłem i c) inni ludzie odpowiedzieliby. Często pomijam pytania bez danych, ponieważ mam dość zgadywania o danych, które im powiedziano, moja odpowiedź była do bani, ponieważ odgadłem źle.

2) Zadaj jedno jasne pytanie. "Jak wykonuję swoją pracę" nie jest jednym jasnym pytaniem. "Jak wziąć te przykładowe dane i utworzyć podzbiór w agregacji, jak to Przykładowe wyjście" jest jednym konkretnym pytaniem.

3) pytaj dalej! Wszyscy jesteśmy lepsi z praktyką. Próbujesz zrobić więcej w R, A mniej w Excelu, więc masz wyraźnie ponadprzeciętną inteligencję. Używaj R i zadawaj pytania. Z czasem wszystko będzie łatwiejsze.

4) uważaj na swoje słowa, Kiedy opisujesz rzeczy. W edytowanym pytaniu mówisz, że masz "listę" rzeczy. Lista W R jest specyficzną strukturą danych. Podejrzewam, że masz ramkę danych i używasz terminu" lista " w ogólnym znaczeniu. Może to spowodować pewne zamieszanie. Ilustruje również, dlaczego chcesz podać własne dane.

 19
Author: JD Long,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-12 16:30:49

Używanie symulowanych danych JD Long i dodawanie sd i zliczeń:

   library(reshape)  # not reshape2
   cast(myDf.melt, school + teacher ~ ., margins=TRUE , c(mean, sd, length))
   school teacher     mean       sd length
1    BSA1    Dick 4.663140 3.718773     14
2    BSA1   Harry 4.310802 1.430594      9
3    BSA1     Tom 5.505247 4.045846      4
4    BSA1   (all) 4.670451 3.095980     27
5    BSA2    Dick 6.110988 2.304104     15
6    BSA2   Harry 5.007221 2.908146      9
7    BSA2     Tom 4.337063 2.789244     14
8    BSA2   (all) 5.196018 2.682924     38
9    HSA1    Dick 4.508610 2.946961     11
10   HSA1   Harry 4.890741 2.977305     13
11   HSA1     Tom 4.721124 3.193576     11
12   HSA1   (all) 4.717335 2.950959     35
13  (all)   (all) 4.886576 2.873637    100
 10
Author: 42-,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-12 17:26:18

Poniżej znajduje się kilka różnych sposobów generowania tego za pomocą stosunkowo nowego pakietu pivottabler.

Ujawnienie: jestem autorem pakietu.

Aby uzyskać więcej informacji, zobacz stronę pakietu na CRAN oraz różne winiety pakietów dostępne na tej stronie.

Przykładowe dane (takie same jak powyżej)

set.seed(1)
school  <- sample(c("BSA1", "BSA2", "HSA1"), 100, replace=T)
teacher <- sample(c("Tom", "Dick", "Harry"), 100, replace=T)
growth <- rnorm(100, 5, 3)
myDf <- data.frame(school, teacher, growth)

Szybkie wyjście tabeli przestawnej do konsoli jako zwykły tekst

library(pivottabler)
# arguments:  qhpvt(dataFrame, rows, columns, calculations, ...)
qpvt(myDf, c("school", "teacher"), NULL,  
     c("Average Growth"="mean(growth)", "Std Dev"="sd(growth)",
       "# of Scholars"="n()"),
     formats=list("%.1f", "%.1f", "%.0f"))

Wyjście Konsoli:

              Average Growth  Std Dev  # of Scholars  
BSA1   Dick              4.7      3.7             14  
       Harry             4.3      1.4              9  
       Tom               5.5      4.0              4  
       Total             4.7      3.1             27  
BSA2   Dick              6.1      2.3             15  
       Harry             5.0      2.9              9  
       Tom               4.3      2.8             14  
       Total             5.2      2.7             38  
HSA1   Dick              4.5      2.9             11  
       Harry             4.9      3.0             13  
       Tom               4.7      3.2             11  
       Total             4.7      3.0             35  
Total                    4.9      2.9            100  

Szybkie wyjście stołu obrotowego jako widget html

library(pivottabler)
qhpvt(myDf, c("school", "teacher"), NULL,  
     c("Average Growth"="mean(growth)", "Std Dev"="sd(growth)",
       "# of Scholars"="n()"),
     formats=list("%.1f", "%.1f", "%.0f"))

Wyjście widżetu HTML:

Tutaj wpisz opis obrazka

Generowanie tabeli przestawnej przy użyciu bardziej szczegółowej składni

Ma to więcej opcji, np. zmiana nazwy sumy.

library(pivottabler)
pt <- PivotTable$new()
pt$addData(myDf)
pt$addRowDataGroups("school", totalCaption="(all)")
pt$addRowDataGroups("teacher", totalCaption="(all)")
pt$defineCalculation(calculationName="c1", caption="Average Growth", 
   summariseExpression="mean(growth)", format="%.1f")
pt$defineCalculation(calculationName="c2", caption="Std Dev", 
   summariseExpression="sd(growth)", format="%.1f")
pt$defineCalculation(calculationName="c3", caption="# of Scholars", 
   summariseExpression="n()", format="%.0f")
pt  # to output to console as plain text
pt$renderPivot() # to output as a html widget

Wyjście widżetu HTML:

Tutaj wpisz opis obrazka

 1
Author: cbailiss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-10 08:18:01

Przepraszam za autopromocję, ale spójrz na mój pakiet expss .

Kod generujący wyjście poniżej:

set.seed(1)
school  <- sample(c("BSA1", "BSA2", "HSA1"), 100, replace=T)
teacher <- sample(c("Tom", "Dick", "Harry"), 100, replace=T)
growth <- rnorm(100, 5, 3)

myDf <- data.frame(school, teacher, growth)

library(expss)
myDf %>% 
    # 'tab_cells' - variables on which statistics will be calculated
    # "|" is needed to suppress 'growth' in row labels
    tab_cells("|" = growth) %>%  
    # 'tab_cols' - variables for columns. Can be ommited
    tab_cols(total(label = "")) %>% 
    # 'tab_rows' - variables for rows.
    tab_rows(school %nest% list(teacher, "(All)"), "|" = "(All)") %>% 
    # 'method = list' is needed for statistics labels in column
    tab_stat_fun("Average Growth" = mean, 
                 "Std Dev" = sd, 
                 "# of scholars" = length, 
                 method = list) %>% 
    # finalize table
    tab_pivot()

Powyższy kod daje obiekt dziedziczony z danych.ramka, która może być używana ze standardowymi operacjami R (podzbiór z {[2] } itd.). Istnieje jednak specjalna metoda print dla tego obiektu. Wyjście konsoli:

 |       |       | Average Growth | Std Dev | # of scholars |
 | ----- | ----- | -------------- | ------- | ------------- |
 |  BSA1 |  Dick |            4.7 |     3.7 |            14 |
 |       | Harry |            4.3 |     1.4 |             9 |
 |       |   Tom |            5.5 |     4.0 |             4 |
 |       | (All) |            4.7 |     3.1 |            27 |
 |  BSA2 |  Dick |            6.1 |     2.3 |            15 |
 |       | Harry |            5.0 |     2.9 |             9 |
 |       |   Tom |            4.3 |     2.8 |            14 |
 |       | (All) |            5.2 |     2.7 |            38 |
 |  HSA1 |  Dick |            4.5 |     2.9 |            11 |
 |       | Harry |            4.9 |     3.0 |            13 |
 |       |   Tom |            4.7 |     3.2 |            11 |
 |       | (All) |            4.7 |     3.0 |            35 |
 | (All) |       |            4.9 |     2.9 |           100 |

Wyjście przez htmlTable w knitr, RStudio viewer lub Shiny:

 0
Author: Gregory Demin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-10 09:30:08