Вывод в виде сводной таблицы в R? - PullRequest
12 голосов
/ 12 июля 2011

Я пишу отчет, который требует генерации нескольких сводных таблиц в Excel. Я хотел бы думать, что есть способ сделать это в R, чтобы я мог избежать Excel. Я хотел бы вывод, как на скриншоте ниже (имена учителей отредактированы). Насколько я могу судить, я мог бы использовать пакет изменения формы для вычисления совокупных значений, но мне нужно было бы это сделать несколько раз и каким-то образом получить все данные в правильном порядке. На этом этапе я должен просто сделать это в Excel. У кого-нибудь есть предложения или рекомендации по пакетам? Спасибо!

(EDIT) Данные начинаются со списка учеников, их учителя, школы и роста. Затем эти данные агрегируются, чтобы получить список учителей с их средним ростом в классе. Обратите внимание, что учителя затем группируются по школе. Самая большая проблема, которую я предвижу сделать с помощью R на данный момент, заключается в том, как получить промежуточные итоговые и итоговые строки (итоговые данные BSA1, итоговые итоги и т. Д.), Поскольку они не относятся к типу наблюдений, как другие? Вам просто нужно вручную рассчитать их и попытаться получить их в правильном порядке, чтобы они отображались в нижней части этой группы?

example

Ответы [ 4 ]

19 голосов
/ 12 июля 2011

Вот свэг в битах вычисления:

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

Я не обращался к форматированию вывода, только к расчету. Полученный фрейм данных должен выглядеть следующим образом:

   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

В этом примере для обработки промежуточных итогов используется пакет reshape2.

Я думаю, что R - правильный инструмент для работы здесь. Я могу полностью понять, не будучи уверенным, как начать этот анализ. Я пришел в R из Excel несколько лет назад, и поначалу это может быть непросто. Позвольте мне указать четыре профессиональных совета, которые помогут вам получить лучшие ответы в Stack Overflow:

1) предоставлять данные, даже если они имитируются: вы можете видеть, что я смоделировал некоторые данные в начале моего ответа. Если бы вы предоставили это моделирование, это бы а) сэкономило мне время б) дало вам ответ, в котором использовалась ваша собственная структура данных, а не тот, который я придумал, и в) другие люди ответили бы. Я часто пропускаю вопросы без данных, потому что устала гадать о том, что им говорят, что мой ответ отстой, потому что я угадала неправильно.

2) Задайте один четкий вопрос. «Как я делаю свою работу» - это не единственный четкий вопрос. «Как мне взять данные этого примера и создать промежуточные итоги в агрегации, как в этом примере вывода» - это отдельный конкретный вопрос.

3) продолжайте спрашивать! Мы все поправляемся с практикой. Вы пытаетесь делать больше в R и меньше в Excel, поэтому у вас явно выше среднего интеллекта. Продолжайте использовать R и продолжайте задавать вопросы. Со временем все станет легче.

4) Будьте осторожны со своими словами при описании вещей. Вы говорите, что в отредактированном вопросе у вас есть «список» вещей. Список в R - это конкретная структура данных. Я подозреваю, что у вас действительно есть фрейм данных, и вы используете термин «список» в общем смысле. Это может привести к путанице. Это также показывает, почему вы хотите предоставить свои собственные данные.

10 голосов
/ 12 июля 2011

Использование смоделированных данных JD Long и добавление sd и count:

   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
1 голос
/ 10 июня 2017

Ниже приведено несколько различных способов создания этого с использованием относительно нового пакета pivottabler.

Раскрытие: я автор пакета.

Для получения дополнительной информации см. Страницу пакета на CRAN и различные виньетки пакета, доступные на этой странице.

Пример данных (как указано выше)

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

Вывод на консоль:

              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  

Быстрый вывод сводной таблицы в виде 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"))

Вывод HTML-виджета:

enter image description here

Создание сводной таблицы с использованием более подробного синтаксиса

У этого есть больше опций, например итоги переименования.

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

Вывод HTML-виджета:

enter image description here

0 голосов
/ 10 июня 2017

Извините за автоматическое продвижение, но взгляните на мой пакет expss .

Код для генерации вывода ниже:

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

Код выше дает объект, унаследованный от данных.кадр, который можно использовать со стандартными операциями R (поднабор с [ и т. д.).Но для этого объекта есть специальный print метод.Консольный вывод:

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

Вывод через htmlTable в Knitr, RStudio Viewer или Shiny:

image

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...