【问题标题】:Include dimension names in row and column headers for LaTeX-formatted contingency table在 LaTeX 格式的列联表的行和列标题中包含维度名称
【发布时间】:2012-05-22 14:11:23
【问题描述】:

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

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

【问题讨论】:

    标签: r xtable


    【解决方案1】:

    我自己有一个相当老套的解决方案,但我也想看看其他方法。当然,如果将这段代码的变体添加到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
                 )
    

    【讨论】:

      【解决方案2】:

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

      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)
      

      【讨论】:

      • 当然我应该发布一个最小的工作示例。很抱歉没有这样做。你介意我改编你的例子吗? -- 但是,生成的 xtable 不包含维度名称。
      • 没问题。是的,后来我意识到乳胶输出不包括维度名称。我的方法可能是在 tex 本身中解决这个问题,但如果你知道如何直接使用 xtable 来解决这个问题,请告诉我。
      • 查看我自己的答案以获得xtable 解决方案。
      【解决方案3】:

      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 包。

      相关:Creating a latex table from ftable object in R.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-28
        相关资源
        最近更新 更多