dplyr и stargazerМы продолжаем работать с файлом про шоколадные торты:
cakes <- read.csv("https://raw.githubusercontent.com/vincentarelbundock/Rdatasets/master/csv/lme4/cake.csv")
Посмотрим, как можно выводить описательные статистики с помощью dplyr. Запросим внутри summarise() число наблюдений через n(), среднее и стандартное отклонение:
library(dplyr)
cakes %>% summarise(observations = n(),
                    avg = mean(temp),
                    sd = sd(temp))
##   observations avg       sd
## 1          270 200 17.10997
Мы вывели на экран нужные характеристики. Теперь попробуем на их основе создать новые. Добавим столбец cv с коэффициентом вариации:
cakes %>% summarise(observations = n(),
                    avg = mean(temp),
                    sd = sd(temp)) %>% 
  mutate(cv = sd / avg)
##   observations avg       sd         cv
## 1          270 200 17.10997 0.08554983
В mutate() можно указывать любые названия столбцов, с пробелами, на кириллице и прочим. Убедимся в этом: назовём столбец с коэффициентов вариации иначе и переведём его в проценты:
cakes %>% summarise(observations = n(),
                    avg = mean(temp),
                    sd = sd(temp)) %>% 
             mutate("CV (in %)" = sd / avg * 100)
##   observations avg       sd CV (in %)
## 1          270 200 17.10997  8.554983
Если нужно вывести описательные статистики по группам, можно сочетать groupby() и summarise():
cakes %>% group_by(recipe) %>%
  summarise(observations = n(),
            avg = mean(temp),
            sd = sd(temp)) %>% 
  mutate("CV (in %)" = sd / avg * 100)
## # A tibble: 3 x 5
##   recipe observations   avg    sd `CV (in %)`
##   <fct>         <int> <dbl> <dbl>       <dbl>
## 1 A                90   200  17.2        8.59
## 2 B                90   200  17.2        8.59
## 3 C                90   200  17.2        8.59
Теперь познакомимся с библиотекой stargazer. R позволяет выгружать не только таблицы с результатами регрессии, но и почти любые таблицы, например, таблицу с описательными статистиками.
Для начала загрузим библиотеку stargazer. Она используется для выгрузки таблиц «во внешний мир». Библиотека называется так неслучайно: обычно она используется для выгрузки результатов регрессионных моделей, а в моделях значимость коэффициентов для наглядности обозначается звёздочками. Вот и получается star + gaze (глазеть, пристально смотреть), в итоге stargazer.
install.packages("stargazer")
library(stargazer)
Для того, чтобы вывести таблицу с описательными статистиками, нужно просто набрать stargazer() и указать датафрейм:
stargazer(cakes) 
## 
## % Table created by stargazer v.5.2.2 by Marek Hlavac, Harvard University. E-mail: hlavac at fas.harvard.edu
## % Date and time: пт, мар 29, 2019 - 02:33:31
## \begin{table}[!htbp] \centering 
##   \caption{} 
##   \label{} 
## \begin{tabular}{@{\extracolsep{5pt}}lccccccc} 
## \\[-1.8ex]\hline 
## \hline \\[-1.8ex] 
## Statistic & \multicolumn{1}{c}{N} & \multicolumn{1}{c}{Mean} & \multicolumn{1}{c}{St. Dev.} & \multicolumn{1}{c}{Min} & \multicolumn{1}{c}{Pctl(25)} & \multicolumn{1}{c}{Pctl(75)} & \multicolumn{1}{c}{Max} \\ 
## \hline \\[-1.8ex] 
## X & 270 & 135.500 & 78.086 & 1 & 68.2 & 202.8 & 270 \\ 
## replicate & 270 & 8.000 & 4.329 & 1 & 4 & 12 & 15 \\ 
## temperature & 270 & 200.000 & 17.110 & 175 & 185 & 215 & 225 \\ 
## angle & 270 & 32.122 & 8.213 & 18 & 26 & 36.8 & 63 \\ 
## temp & 270 & 200.000 & 17.110 & 175 & 185 & 215 & 225 \\ 
## \hline \\[-1.8ex] 
## \end{tabular} 
## \end{table}
Для тех, кто умеет работать в LaTeX, все просто — R выдал теховский код, который можно просто скопировать в tex-файл. Обратите внимание: в начале кода в качестве комментария всегда указывается, есть ли необходимость догружать (указывать в преамбуле) специальные пакеты или нет. В данном случае не нужно.
Можно выгрузить таблицу в tex-файл. Но это будет файл только с кодом для таблицы, без преамбулы и прочего:
stargazer(cakes, out = "mytable.tex")
## 
## % Table created by stargazer v.5.2.2 by Marek Hlavac, Harvard University. E-mail: hlavac at fas.harvard.edu
## % Date and time: пт, мар 29, 2019 - 02:33:31
## \begin{table}[!htbp] \centering 
##   \caption{} 
##   \label{} 
## \begin{tabular}{@{\extracolsep{5pt}}lccccccc} 
## \\[-1.8ex]\hline 
## \hline \\[-1.8ex] 
## Statistic & \multicolumn{1}{c}{N} & \multicolumn{1}{c}{Mean} & \multicolumn{1}{c}{St. Dev.} & \multicolumn{1}{c}{Min} & \multicolumn{1}{c}{Pctl(25)} & \multicolumn{1}{c}{Pctl(75)} & \multicolumn{1}{c}{Max} \\ 
## \hline \\[-1.8ex] 
## X & 270 & 135.500 & 78.086 & 1 & 68.2 & 202.8 & 270 \\ 
## replicate & 270 & 8.000 & 4.329 & 1 & 4 & 12 & 15 \\ 
## temperature & 270 & 200.000 & 17.110 & 175 & 185 & 215 & 225 \\ 
## angle & 270 & 32.122 & 8.213 & 18 & 26 & 36.8 & 63 \\ 
## temp & 270 & 200.000 & 17.110 & 175 & 185 & 215 & 225 \\ 
## \hline \\[-1.8ex] 
## \end{tabular} 
## \end{table}
Посмотрим, в какую папку этот файл сохранился:
getwd()
## [1] "/Users/allat/Desktop"
Тем, кто в LaTeX не работает, легче не стало. Но выход есть. Stargazer умеет не только выводить код в консоль, но и сохранять результат в отдельный файл. Этот файл может быть теховским файлом (.tex), текстовым (.txt) и html-файлом (.htmlили .htm). Word умеет открывать файлы с расширением .htm. И Libre Office/Open Office тоже.
stargazer(cakes, type = "html", 
          out = "mytable.htm")
| Statistic | N | Mean | St. Dev. | Min | Pctl(25) | Pctl(75) | Max | 
| X | 270 | 135.500 | 78.086 | 1 | 68.2 | 202.8 | 270 | 
| replicate | 270 | 8.000 | 4.329 | 1 | 4 | 12 | 15 | 
| temperature | 270 | 200.000 | 17.110 | 175 | 185 | 215 | 225 | 
| angle | 270 | 32.122 | 8.213 | 18 | 26 | 36.8 | 63 | 
| temp | 270 | 200.000 | 17.110 | 175 | 185 | 215 | 225 | 
Теперь попробуем вывести описательные статистики не для всех переменных, а для нескольких:
stargazer(subset(cakes, select = c("angle", "temp")), 
          type = "html",
          out = "mytable.htm")
| Statistic | N | Mean | St. Dev. | Min | Pctl(25) | Pctl(75) | Max | 
| angle | 270 | 32.122 | 8.213 | 18 | 26 | 36.8 | 63 | 
| temp | 270 | 200.000 | 17.110 | 175 | 185 | 215 | 225 | 
Добавим заголовок для таблицы и комментарии (notes), а также выровним комментарии по правому краю ('r'):
stargazer(subset(cakes, select = c("angle", "temp")), 
          type = "html",
          out = "mytable.htm",
          title = "Summary statistics",
          notes = "N = 270",
          notes.align = 'r')
| Statistic | N | Mean | St. Dev. | Min | Pctl(25) | Pctl(75) | Max | 
| angle | 270 | 32.122 | 8.213 | 18 | 26 | 36.8 | 63 | 
| temp | 270 | 200.000 | 17.110 | 175 | 185 | 215 | 225 | 
| N = 270 | |||||||
Сообщим R, что мы хотим не более 2 знаков после запятой:
stargazer(subset(cakes, select = c("angle", "temp")), 
          type = "html",
          out = "mytable.htm",
          title = "Summary statistics",
          notes = "N = 270",
          notes.align = 'r',
          digits = 2)
| Statistic | N | Mean | St. Dev. | Min | Pctl(25) | Pctl(75) | Max | 
| angle | 270 | 32.12 | 8.21 | 18 | 26 | 36.8 | 63 | 
| temp | 270 | 200.00 | 17.11 | 175 | 185 | 215 | 225 | 
| N = 270 | |||||||
Наконец, отрегулируем, какие статистики убрать, а какие - оставить. Уберём из выдачи число наблюдений (оно у нас есть в комментариях), минимум, максимум, нижний и верхний квантили, но зато добавим медиану:
# omit.summary.stat
# median
stargazer(subset(cakes, select = c("angle", "temp")), 
          type = "html",
          out = "mytable.htm",
          title = "Summary statistics",
          notes = "N = 270",
          notes.align = 'r',
          digits = 2,
          omit.summary.stat = c("n", "min", "max", "p25", "p75"),
          median = TRUE)
| Statistic | Mean | St. Dev. | Median | 
| angle | 32.12 | 8.21 | 31 | 
| temp | 200.00 | 17.11 | 200 | 
| N = 270 | |||
На этом возможности stargazer не ограничиваются. Очень рекомендую запросить help и немного порефлексировать над имеющимися опциями.
?stargazer