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?
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.
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
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:
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:
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:
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