Eri*_*een 32 latex r xtable knitr r-markdown
我正在使用带有R Markdown和knitr的xtable来生成我用\ input {}调用的.tex文件.效果很好,但我还没有弄清楚如何创建像这里显示的多列.有谁知道怎么做到这个?
到目前为止,我正在使用:
tbl <- xtable(data, align="l r r r r r")
colnames(tbl) <- c("Variable",
"Mean", "Std Dev",
"Mean", "Std Dev",
"Difference")
caption(tbl) <- c("Table Title")
print(tbl,
include.rownames=FALSE,
caption.placement="top",
booktabs=TRUE,
type="latex",
file="output.tex")
Run Code Online (Sandbox Code Playgroud)
我想在每个"Mean"和"Std Dev"("治疗"和"控制")上有一个不同的分组标题.
或者,是否有更好的方法使用R Markdown/knitr自动生成表格?我不想手动编辑表格,因为报告需要自动生成.
更新: @agstudy:我是乳胶新手,但我认为这是我希望用xtable(或类似xtable)自动生成的输出:
\begin{tabular}{lrrrrr}
\toprule
& \multicolumn{2}{c}{Treatment} & \multicolumn{2}{c}{Control} & \\
\cmidrule(lr){2-3} \cmidrule(lr){4-5}
Variable & Mean & Std Dev & Mean & Std Dev & Difference \\
\midrule
var1 & 1 & 2 & 3 & 4 & 5 \\
\bottomrule
\end{tabular}
Run Code Online (Sandbox Code Playgroud)
更新2: @Jonathan:我花了一些时间来理解你的建议.我接受了你的推荐,但它确实奏效了.
在R markdown块我现在使用:
tbl <- xtable(data)
print(tbl,
only.contents=TRUE,
include.rownames=FALSE,
type="latex",
digits(tbl) <- c(0,1,1,1,1,1),
file="output/tblout.tex")
Run Code Online (Sandbox Code Playgroud)
然后在文中,我使用:
\begin{tabular}{lddddd}
\toprule
& \multicolumn{2}{c}{Treatment} & \multicolumn{2}{c}{Control} & \\
\cmidrule(lr){2-3} \cmidrule(lr){4-5}
Variable & \multicolumn{1}{r}{Mean} & \multicolumn{1}{r}{Std Dev} & \multicolumn{1}{r}{Mean} & \multicolumn{1}{r}{Std Dev} & \multicolumn{1}{r}{Difference} \\
\midrule
\input{../output/tblout}
\bottomrule
\end{tabular}
Run Code Online (Sandbox Code Playgroud)
我会看看是否有人对本机xtable(或其他包)解决方案有任何其他建议.否则,我会接受你的回答.谢谢!
Ada*_*amO 28
我认为add.to.rowxtable中的选项完美地实现了这一点.
这里的示例代码:
require(xtable)
age <- sample(c('30-50', '50-70', '70+'), 200, replace=T)
sex <- sample(c('Male', 'Female'), 200, replace=T)
val <- table(age, sex)
val <- rbind(val, formatC(prop.table(val)*100, format='f', digits=1))
val <- structure(val, dim=c(3, 4))
val <- rbind(c('n', '%'), val)
rownames(val) <- c('', sort(unique(age)))
val <- xtable(val)
addtorow <- list()
addtorow$pos <- list(0)
addtorow$command <- paste0(paste0('& \\multicolumn{2}{c}{', sort(unique(sex)), '}', collapse=''), '\\\\')
print(val, add.to.row=addtorow, include.colnames=F)
Run Code Online (Sandbox Code Playgroud)
Jon*_*sen 17
假设表的形式在运行中是相同的(即,只有数字正在改变),我的建议是使用only.contents参数来print.xtable手动编码多列标题.据我所知xtable,不能自己做多柱细胞.
这是一个带kableExtra包裹的儿童游戏。
\documentclass{article}
\usepackage{booktabs}
\begin{document}
<<setup, include=FALSE>>=
library(knitr)
opts_chunk$set(echo=FALSE)
library(kableExtra)
options(knitr.table.format = "latex")
mx <- matrix(1:6, ncol=3)
rownames(mx) <- LETTERS[1:NROW(mx)]
colnames(mx) <- sprintf("Col %s", LETTERS[1:NCOL(mx)])
@
<<results='asis'>>=
kable(mx, booktabs = TRUE, caption = "My table", align = "c") %>%
add_header_above(c(" ", "First"=2, "Second"=1)) %>%
kable_styling(latex_options = "hold_position")
@
<<results='asis'>>=
kable(mx, booktabs = TRUE, caption = "My other table", align = "c") %>%
add_header_above(c(" ", "First"=2, "Second"=1)) %>%
kable_styling(latex_options = "hold_position") %>%
group_rows("Nice!", 1, 2)
@
\end{document}
Run Code Online (Sandbox Code Playgroud)