2016-08-12 3 views
4

Я хочу автоматизировать создание дескриптивных таблиц с заголовками для групп переменных - используя knitr и (идеально) stargazer. Поскольку мне нужны взвешенные описания, я не использую встроенные функции stargazer в сводных функциях, но генерирую фреймворк данных, содержащий статистику, и использую аргумент summary=FALSE для печати данных.Переменные заголовки групп в сводной таблице stargazer

выпуск 1: df с переменными и заголовками в виде строк и сводная статистика как столбцы не работают, потому что stargazer преобразует NA s в строки заголовка в $$ s, что нарушает процесс вязания.

Вопрос 2: В качестве работы я сгенерировал блок данных с переменными и заголовками в виде столбцов и сводной статистики в виде строк и использовал аргумент flip=TRUE, чтобы строки и столбцы отображались на выходе stargazer. Хотя это позволяет мне иметь пустые символьные векторы для заголовков и числовых векторов для переменных, stargazer не выводит числовые векторы в математическом режиме, но (кажется) обрабатывает их как символ.

Пример:

# create example df 
df <- data.frame(heading=c(" "," "," "),var1=c(1,2,3),var2=c(4,5,6)) 
df$heading <- as.character(df$heading) 

# output using stargazer 
stargazer(df, summary = FALSE, flip = TRUE) 

% Table created by stargazer v.5.2 by Marek Hlavac, Harvard University. E-mail: hlavac at fas.harvard.edu 
% Date and time: Fri, Aug 12, 2016 - 10:39:01 
\begin{table}[!htbp] \centering 
    \caption{} 
    \label{} 
\begin{tabular}{@{\extracolsep{5pt}} cccc} 
\\[-1.8ex]\hline 
\hline \\[-1.8ex] 
& 1 & 2 & 3 \\ 
\hline \\[-1.8ex] 
heading & & & \\ 
var1 & 1 & 2 & 3 \\ 
var2 & 4 & 5 & 6 \\ 
\hline \\[-1.8ex] 
\end{tabular} 
\end{table} 

Вопрос: Как добавить заголовки (пустые строки) в описательной таблице и до сих пор получить выход в режиме математики для переменной статистики?

+0

Звездочет просто генерирует зверский LaTeX и uncustomisable: в частности, нет никакого способа, чтобы говорить Звездочету делать то, что вы хотите, вы должны изменить полученный Код LaTeX. Не используйте этот пакет - используйте другой генератор таблицы, например Pander. –

ответ

2

Как уже упоминалось, Konrad Rudolph, stargazer, вероятно, не может этого сделать. Следующее решение использует xtable вместо:

\documentclass{article} 
\usepackage{array} 

\begin{document} 

<<results = "asis", echo = FALSE>>= 
library(xtable) 

group1 <- data.frame(
    name = c("v1", "v2"), 
    mean = 1:2, min = 3:4, max = 5:6, 
    stringsAsFactors = FALSE) 
group2 <- data.frame(
    name = c("v3", "v4"), 
    mean = -(1:2), min = -(3:4), max = -(5:6), 
    stringsAsFactors = FALSE) 

dat <- rbind(
    c("\\textbf{Group 1}", rep(NA, ncol(group1) - 1)), 
    group1, 
    c("\\textbf{Group 2}", rep(NA, ncol(group1) - 1)), 
    group2) 

colnames(dat) <- sprintf("\\multicolumn{1}{c}{%s}", colnames(dat)) 

print.xtable(
    xtable(dat, 
     caption = "Summary of Groups 1 and 2.", 
     align = c("l", "l", rep(">{$}r<{$}", 3))), 
    include.rownames = FALSE, 
    sanitize.text.function = identity, 
    sanitize.colnames.function = identity) 
@ 
\end{document} 

Концепция довольно проста, но есть несколько причуд, чтобы принять во внимание:

  • Во-первых, я генерировать выборочные данные, предполагая, что 2 группы с 2-х переменных каждый и 3 описания на переменную.
  • Когда rbind группы, просто вставьте строки для заголовков, установив пустые столбцы на NA. Не забудьте удвоить обратную косую черту при использовании LaTeX в строках. (Используйте \multicolumn, если заголовки слишком широкие.)
  • Поскольку столбцы с 2 по 4 будут установлены в математическом режиме, мы должны убедиться, что имена столбцов будут напечатаны как обычный текст. «Width-1-multicolumn» позволяет изменять тип столбца только для одной ячейки, см. here.
  • Используйте аргумент alignxtable, чтобы указать тип столбца. Нам нужен один нормальный столбец с левым выравниванием и три выравнивания по правому краю в математическом режиме. Чтобы заставить математический режим использовать >{$}r<{$}, см. here. (Есть дополнительные l, которые будут проигнорированы - это имена строк, которые мы скрываем.)
  • Поскольку у нас есть разметка LaTeX в данных, нам нужно отключить дезинфицирующее средство для xtable. Поэтому установите sanitize.text.function и sanitize.colnames.function на identity.

Результат:

Result

+1

Мне нравится, как значения примера не могут быть реальными ^^ – AlexR

+0

@AlexR Да ... Сначала я составил числа, а затем решил разместить (произвольные) надписи на них. Не так умно. ;-) –

+0

Ну, это заставило меня хотя бы улыбнуться :-) – AlexR

Смежные вопросы