Включить имена измерений в заголовки строк и столбцов для таблицы непредвиденных обстоятельств в формате LaTeX.

Если категории атрибутов в таблице непредвиденных обстоятельств являются простыми числами, использование только этих чисел в качестве заголовка столбца/строки недостаточно — требуется описание того, что означают числа. На рисунке ниже показана перекрестная классификация размера домохозяйства по сравнению с количеством иностранцев в выборке домохозяйства:

Пример таблицы

Есть ли у кого-нибудь опыт создания таких таблиц с помощью R+LaTeX?


person krlmlr    schedule 22.05.2012    source источник


Ответы (3)


У меня есть довольно хакерское решение, но я хотел бы увидеть и другие подходы. Конечно, было бы неплохо, если бы вариант этого кода был добавлен в 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
             )
person krlmlr    schedule 05.06.2012

Вот один подход. Начните с некоторых данных (вы должны сделать это при публикации вопроса) в матричной форме.

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)
person charlie    schedule 23.05.2012
comment
Конечно, я должен был опубликовать минимальный рабочий пример. Прости, что не сделал этого. Не возражаете, если я адаптирую ваш пример? -- Однако сгенерированная xtable не включает имена измерений. - person krlmlr; 23.05.2012
comment
Без проблем. И да, впоследствии я понял, что латексный вывод не включает имена измерений. Мой подход, вероятно, состоял бы в том, чтобы просто исправить это в самом тексте, хотя, если вы выясните, как это сделать напрямую с помощью xtable, дайте мне знать. - person charlie; 24.05.2012
comment
См. мой собственный ответ для решения xtable. - person krlmlr; 06.06.2012

Есть 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.

Скомпилированный вывод

Связано: Создание латексной таблицы из объекта ftable в R.

person krlmlr    schedule 06.10.2014