Мы продолжаем работать с файлом про шоколадные торты:

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')
Summary statistics
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)
Summary statistics
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)
Summary statistics
Statistic Mean St. Dev. Median
angle 32.12 8.21 31
temp 200.00 17.11 200
N = 270

На этом возможности stargazer не ограничиваются. Очень рекомендую запросить help и немного порефлексировать над имеющимися опциями.

?stargazer