11

如果列联表中属性的类别仅仅是数字,仅使用这些数字作为列/行标题是不够的——需要描述数字的含义。下图显示了家庭规模与家庭样本中外国人数量的交叉分类:

示例表

有没有人有使用 R+LaTeX 制作此类表格的经验?

4

3 回答 3

6

我自己有一个相当老套的解决方案,但我也想看看其他方法。当然,如果将此代码的变体添加到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
             )
于 2012-06-05T09:17:49.560 回答
0

这是一种方法。从矩阵形式的一些数据开始(你应该在发布问题时这样做)。

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)
于 2012-05-23T11:08:27.830 回答
0

可以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 代码需要booktabsdcolumn包。

编译输出

相关:从 R 中的 ftable 对象创建乳胶表

于 2014-10-06T23:03:01.147 回答