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