可以在xtable中创建乳胶多柱?

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)

  • 这应该是公认的答案![here](http://stackoverflow.com/a/32490565/3162788)是另一个使用`add.to.row`参数和`\ multirow`的例子. (4认同)
  • 这对我很有用,我只想添加两个提示:1.pos变量是列表中的列表,而不是标量或向量(我错过了),以及2. pos变量可以设置为0(将添加的行放在标题下方甚至-1(将它放在标题上方,这是我想要的地方) (3认同)

Jon*_*sen 17

假设表的形式在运行中是相同的(即,只有数字正在改变),我的建议是使用only.contents参数来print.xtable手动编码多列标题.据我所知xtable,不能自己做多柱细胞.


MYa*_*208 7

考虑使用包.


Sté*_*ent 5

这是一个带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)

在此处输入图片说明