11

分割表の属性のカテゴリが単なる数字である場合、これらの数字のみを列/行ヘッダーとして使用するだけでは十分ではありません。数字が何を意味するのかを説明する必要があります。下の図は、世帯規模と世帯サンプルの外国人の数の相互分類を示しています。

例の表

R + LaTeXを使用してそのようなテーブルを作成した経験のある人はいますか?

4

3 に答える 3

6

私は自分自身のかなりハックな解決策を持っていますが、他のアプローチも見たいです。もちろん、このコードのバリアントがに追加されていれば便利ですxtable

私の解決策は、テーブルのrownames()とを更新することです。colnames()行ヘッダーはにrownames()[1]なり、列ヘッダーはになりcolnames()[1]ます。覚えておくべきことがいくつかあります。

  • 行ヘッダーを使用すると、結果のテーブルの列数が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

これが1つのアプローチです。マトリックス形式のデータ(質問を投稿するときにこれを行う必要があります)から始めます。

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を使用して、ラテックス形式のテーブルを出力できます。

library(xtable)
xtable(dat)
于 2012-05-23T11:08:27.830 に答える