Получение отдельной сводной статистики по категориальной переменной с помощью пакета Stargazer

Я хотел бы использовать stargazer для создания сводной статистики для каждая категория группирующей переменной. Я мог бы сделать это в отдельных таблицах, но я бы хотел все это в одной - если это не является неоправданно сложной задачей для этого пакета.

Например

library(stargazer)
stargazer(ToothGrowth, type = "text")
#> 
#> =========================================
#> Statistic N   Mean  St. Dev.  Min   Max  
#> -----------------------------------------
#> len       60 18.813  7.649   4.200 33.900
#> dose      60 1.167   0.629   0.500 2.000 
#> -----------------------------------------

предоставляет сводную статистику для переменных продолжения в ToothGrowth. Я хотел бы разделить это резюме по категориальной переменной supp, также в ToothGrowth.

Два предложения для желаемого результата,

stargazer(ToothGrowth ~ supp, type = "text")
#> 
#> ==================================================
#> Statistic         N   Mean   St. Dev.  Min   Max  
#> --------------------------------------------------
#> OJ       len       30 16.963  8.266   4.200 33.900
#>          dose      30  1.167  0.634   0.500  2.000
#> VC       len       30 20.663  6.606   8.200 30.900
#>          dose      30  1.167  0.634   0.500  2.000 
#> --------------------------------------------------
#> 
 stargazer(ToothGrowth ~ supp, type = "text")
#> 
#> ==================================================
#> Statistic          N   Mean   St. Dev.  Min   Max  
#> --------------------------------------------------
#> len               
#>        _by VC     30 16.963  8.266   4.200 33.900
#>        _by VC     30  1.167  0.634   0.500  2.000
#> _tot              60 18.813  7.649   4.200 33.900
#> 
#> dose             
#>        _by OJ     30 20.663  6.606   8.200 30.900
#>        _by OJ     30  1.167  0.634   0.500  2.000 
#> _tot              60 1.167   0.629   0.500 2.000         
#> --------------------------------------------------

person Michael    schedule 19.08.2014    source источник
comment
Черт возьми, я только что погуглил сводку категориальных переменных звездочета, и это был первый хит.   -  person Michael    schedule 01.10.2014
comment
Я ценю ваш вопрос и назначил награду, чтобы привлечь к нему больше внимания. Мне было интересно, нашли ли вы хорошее решение самостоятельно и / или отвечает ли какой-либо из текущих ответов на ваш вопрос?   -  person Eric Fail    schedule 01.02.2018
comment
Я считаю, что похоже, что ваша награда сработала, и ответ ниже делает то, что я хотел? Думаю, когда я изначально спросил об этом, я не чувствовал, что ответ в точности соответствует моим потребностям.   -  person Michael    schedule 04.02.2018


Ответы (4)


Решение

library(stargazer)
library(dplyr)
library(tidyr)

ToothGrowth %>%
    group_by(supp) %>%
    mutate(id = 1:n()) %>%
    ungroup() %>%
    gather(temp, val, len, dose) %>%
    unite(temp1, supp, temp, sep = '_') %>%
    spread(temp1, val) %>%
    select(-id) %>%
    as.data.frame() %>%
    stargazer(type = 'text')

Результат

=========================================
Statistic N   Mean  St. Dev.  Min   Max  
-----------------------------------------
OJ_dose   30 1.167   0.634   0.500 2.000 
OJ_len    30 20.663  6.606   8.200 30.900
VC_dose   30 1.167   0.634   0.500 2.000 
VC_len    30 16.963  8.266   4.200 33.900
-----------------------------------------

Объяснение

Это избавляет от проблемы, упомянутой OP в комментарии к исходному ответу: «Мне действительно нужна единая таблица со сводной статистикой, разделенной категориальной переменной, вместо создания отдельных таблиц». Самый простой способ сделать это с stargazer - создать новый фрейм данных, содержащий переменные для наблюдений каждой группы, с использованием стратегии gather(), unite(), spread(). Единственная уловка - избежать дублирования идентификаторов путем создания уникальных идентификаторов по группам и удаления этой переменной перед вызовом stargazer().

person duckmayr    schedule 28.01.2018

Три возможных решения. Один с использованием reporttools и xtable, в одном из которых используется инструменты tidyverse вместе с stargazer, а в-третьих, a base-r решение.

Первый,

Я хочу предложить вам взглянуть на reporttools, которые вроде как покидает stargazer, но я думаю, вам следует принять посмотрите на это,

# install.packages("reporttools")  #Use this to install it, do this only once
require(reporttools)

vars <- ToothGrowth[,c('len','dose')]
group <- ToothGrowth[,c('supp')]

## display default statistics, only use a subset of observations, grouped analysis
tableContinuous(vars = vars, group = group, prec = 1, cap = "Table of 'len','dose' by 'supp' ", lab = "tab: descr stat")

% latex table generated in R 3.3.3 by xtable 1.8-2 package
\begingroup\footnotesize
\begin{longtable}{llrrrrrrrrrr}
 \textbf{Variable} & \textbf{Levels} & $\mathbf{n}$ & \textbf{Min} & $\mathbf{q_1}$ & $\mathbf{\widetilde{x}}$ & $\mathbf{\bar{x}}$ & $\mathbf{q_3}$ & \textbf{Max} & $\mathbf{s}$ & \textbf{IQR} & \textbf{\#NA} \\ 
  \hline
len & OJ & 30 & 8.2 & 15.5 & 22.7 & 20.7 & 25.7 & 30.9 & 6.6 & 10.2 & 0 \\ 
   & VC & 30 & 4.2 & 11.2 & 16.5 & 17.0 & 23.1 & 33.9 & 8.3 & 11.9 & 0 \\ 
   \hline
 & all & 60 & 4.2 & 13.1 & 19.2 & 18.8 & 25.3 & 33.9 & 7.6 & 12.2 & 0 \\ 
   \hline
dose & OJ & 30 & 0.5 &  0.5 &  1.0 &  1.2 &  2.0 &  2.0 & 0.6 &  1.5 & 0 \\ 
   & VC & 30 & 0.5 &  0.5 &  1.0 &  1.2 &  2.0 &  2.0 & 0.6 &  1.5 & 0 \\ 
   \hline
 & all & 60 & 0.5 &  0.5 &  1.0 &  1.2 &  2.0 &  2.0 & 0.6 &  1.5 & 0 \\ 
   \hline
\hline
\caption{Table of 'len','dose' by 'supp' } 
\label{tab: descr stat}
\end{longtable}
\endgroup

в латексе вы получите прекрасный результат,  Латекс с инструментами отчетов

Второй,

с помощью инструментов tidyverse вместе с stargazer, вдохновленный этим SO-ответом,

# install.packages(c("tidyverse"), dependencies = TRUE)
library(dplyr); library(purrr)
#> ToothGrowth %>% split(. $supp) %>% walk(~ stargazer(., type = "text"))
#> =========================================
#> Statistic N   Mean  St. Dev.  Min   Max  
#> -----------------------------------------
#> len       30 20.663  6.606   8.200 30.900
#> dose      30 1.167   0.634   0.500 2.000 
#> -----------------------------------------
#> =========================================
#> Statistic N   Mean  St. Dev.  Min   Max  
#> -----------------------------------------
#> len       30 16.963  8.266   4.200 33.900
#> dose      30 1.167   0.634   0.500 2.000 
#> -----------------------------------------
#> 

В третьих,

эксклюзивный base-r

by(ToothGrowth, ToothGrowth$supp, stargazer, type = 'text')
    #> =========================================
    #> Statistic N   Mean  St. Dev.  Min   Max  
    #> -----------------------------------------
    #> len       30 20.663  6.606   8.200 30.900
    #> dose      30 1.167   0.634   0.500 2.000 
    #> -----------------------------------------
    #> 
    #> =========================================
    #> Statistic N   Mean  St. Dev.  Min   Max  
    #> -----------------------------------------
    #> len       30 16.963  8.266   4.200 33.900
    #> dose      30 1.167   0.634   0.500 2.000 
    #> -----------------------------------------
    #> ToothGrowth$supp: OJ
    #> [1] ""                                         
    #> [2] "========================================="
    #> [3] "Statistic N   Mean  St. Dev.  Min   Max  "
    #> [4] "-----------------------------------------"
    #> [5] "len       30 20.663  6.606   8.200 30.900"
    #> [6] "dose      30 1.167   0.634   0.500 2.000 "
    #> [7] "-----------------------------------------"
    #> --------------------------------------------------------------- 
    #> ToothGrowth$supp: VC
    #> [1] ""                                         
    #> [2] "========================================="
    #> [3] "Statistic N   Mean  St. Dev.  Min   Max  "
    #> [4] "-----------------------------------------"
    #> [5] "len       30 16.963  8.266   4.200 33.900"
    #> [6] "dose      30 1.167   0.634   0.500 2.000 "
    #> [7] "-----------------------------------------"
person Eric Fail    schedule 28.01.2018

invisible(lapply(levels(ToothGrowth$supp),stargazer))

подойдет, но если вы хотите разделить \ subsction {} между ними, вам, вероятно, следует использовать что-то вроде

invisible(lapply(levels(ToothGrowth$supp),function(sg){
    cat("\\subsection{add your text here}\n")
    print(stargazer(sg)
  })
person Dieter Menne    schedule 19.08.2014
comment
хмммм .... Спасибо! Что, если я хочу изменить различные возможные аргументы в функции stargazer ()? - person Michael; 19.08.2014
comment
Просто добавьте его к призыву звездочета (SG). - person Dieter Menne; 20.08.2014
comment
Спасибо за помощь. Что мне действительно нужно, так это единая таблица со сводной статистикой, разделенной категориальной переменной, вместо того, чтобы создавать отдельные таблицы. Не уверен, есть ли у звездочета такая возможность. - person Michael; 24.08.2014
comment
@DieterMenne, мне нравится простота ваших решений. Мне было интересно, было бы вам интересно добавить к своему ответу комментарий Майкла выше? - person Eric Fail; 31.01.2018

Вы можете просто использовать subset со звездочётом. * Кроме того, убедитесь, что ваши данные представляют собой фрейм данных, использующий as.data.frame для Stargazer для вывода результатов.

library(stargazer)
# Descriptive statistics for Income of Org 1
stargazer(subset(mydata, mydata$org==1),
title="Income for Org 1", type = "html", out="stat_org1.html")
person Viviana Wu    schedule 28.03.2019