Включить имена измерений в заголовки строк и столбцов для таблицы непредвиденных расходов в формате LaTeX
Если категории атрибутов в таблице непредвиденных обстоятельств являются простыми числами, использование этих чисел в качестве заголовка столбца/строки недостаточно - описание, для которого означают числа, требуется. На приведенном ниже рисунке показана перекрестная классификация размера домохозяйства по сравнению с количеством иностранцев в образце домохозяйства:
![Example table]()
Есть ли у кого-нибудь опыт создания таких таблиц с использованием R + LaTeX?
Ответы
Ответ 1
Там ftable
, который превращает таблицу непредвиденных ситуаций в двумерную форматированную таблицу и позволяет указать, что показано в строках, и что в столбцах (также полезно для таблиц более чем двух измерений). Пакет memisc
помогает превратить это в приятный LaTeX:
library(magrittr)
library(memisc)
expand.grid(Foreigners = 0:5, `Total persons` = 1:8) %>%
cbind(Freq = rnorm(6*8, 20, 10)) %>%
xtabs(formula = Freq~.) %>%
ftable %>%
toLatex
Не требуется взломать, а LaTeX можно использовать для имен столбцов в expand.grid
(для поддержки, например, вращения и/или перекрытия нескольких строк). Сгенерированный код LaTeX требует пакетов booktabs
и dcolumn
.
![Compiled output]()
Связано: Создание латексной таблицы из объекта ftable в R.
Ответ 2
У меня есть довольно хакерское решение, но я тоже хотел бы видеть другие подходы. Конечно, было бы неплохо, если бы вариант этого кода был добавлен в xtable
.
Мое решение состоит в обновлении таблиц rownames()
и colnames()
. Заголовок строки переходит в rownames()[1]
, а заголовок столбца переходит в colnames()[1]
. Необходимо запомнить несколько вещей:
- Количество столбцов в результирующей таблице при использовании заголовков строк больше.
Следовательно, среда
tabular
должна быть создана пользователем.
- Если заголовок строки добавлен, заголовок столбца должен включать дополнительный
&
- Не следует деактивировать или иным образом переформатировать имена строк или столбцов после этой операции.
Функция add.crosstab.headers
заботится обо всем. Он может быть применен к результату вызова xtable()
. Также необходимы вспомогательные функции.
macrify <- function(m, s, bs='\\') {
paste(bs, m, '{', s, '}', sep='')
}
boldify <- function(s) {
macrify('textbf', s)
}
add.crosstab.headers <- function(t, row.header=NA, col.header=NA,
sanitize=boldify) {
rownames(t) <- sanitize(rownames(t))
colnames(t) <- sanitize(colnames(t))
if (!is.na(row.header)) {
colnames(t)[1] <- paste('&', colnames(t)[1])
rownames(t) <- paste('&', rownames(t))
row.header <- sanitize(row.header)
row.header <- macrify('rotatebox{90}', row.header)
multirow <- macrify('multirow', nrow(t))
multirow <- macrify(multirow, '*', bs='')
row.header <- macrify(multirow, row.header, bs='')
rownames(t)[1] <- paste(row.header, rownames(t)[1])
}
if (!is.na(col.header)) {
col.header <- sanitize(col.header)
multicolumn <- macrify('multicolumn', ncol(t))
multicolumn <- macrify(multicolumn, 'c', bs='')
col.header <- macrify(multicolumn, col.header, bs='')
col.header <- paste(col.header, '\\\\\n')
col.header <- paste(col.header, '&')
if (!is.na(row.header)) {
col.header <- paste('&', col.header)
}
colnames(t)[1] <- paste(col.header, colnames(t)[1])
}
t
}
Использование будет таким.
dat <- matrix(round(rnorm(9, 20, 10)), 3, 3)
t <- xtable(dat)
t <- add.crosstab.headers(t, row.header='Foreigners', col.header='Total persons')
print.xtable(t,
only.contents=TRUE,
booktabs=TRUE
, sanitize.text.function=identity
)
Ответ 3
Здесь один подход. Начните с некоторых данных (вы должны сделать это при отправке вопроса) в матричной форме.
dat<-matrix(round(rnorm(9,20,10)),3,3)
Создайте вектор имен. Примените имена к матрице. Распечатайте матрицу
persons<-c(seq("0","2"))
foreign<-c(seq("0","2"))
dimnames(dat)<-list(persons=persons, foreign=foreign)
dat
Вы можете использовать xtable для вывода таблицы в формате Latex.
library(xtable)
xtable(dat)