如果列联表中的属性类别仅仅是数字,仅使用这些数字作为列/行标题是不够的 - 需要描述数字的含义。下图显示了家庭规模与家庭样本中外国人数量的交叉分类:
有没有人有使用R + LaTeX制作此类表格的经验?
答案 0 :(得分: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
)
答案 1 :(得分: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)
答案 2 :(得分: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代码需要booktabs
和dcolumn
个包。