【问题标题】:xtable with various column types具有各种列类型的 xtable
【发布时间】:2016-04-26 14:44:59
【问题描述】:

我正在尝试在我的桌子上使用 xtable,其中包含各种列类型,包括数字、乳胶命令和字符串。

例子:

a1 <- paste("\\multirow{2}{*}{", c(1, 2, 3, 4),"}", sep = "")
a2 <- rep(NA, 4)

riffle <- function (a,b) { 
n <- min(length(a), length(b)) 
p1 <- as.vector(rbind(a[1:n], b[1:n])) 
p2 <- c(a[-(1:n)], b[-(1:n)]) 
c(p1, p2) 
}

 a <- riffle(a1, a2)
 b <- rnorm(8, 0, 1)
 c <- rep(c("a", "b"), 2)
 d <- rexp(8, 2)*10
 tab <- cbind(a, b, c, d)
 print(xtable(tab), include.rownames = FALSE)

但是,输出并不令人满意:

 \begin{table}[ht]
    \centering
    \begin{tabular}{llll}
      \hline
    a & b & c & d \\ 
      \hline
       $\backslash$multirow\{2\}\{*\}\{1\} & 0.567183110307595 & a & 17.4277735359976 \\ 
       & -1.45110043335658 & b & 5.78849371967322 \\ 
      $\backslash$multirow\{2\}\{*\}\{2\} & 1.19040399046713 & a & 0.692481031836454 \\ 
       & 1.08180700975955 & b & 8.30343133216384 \\ 
      $\backslash$multirow\{2\}\{*\}\{3\} & 0.770520985309568 & a & 4.95384422575539 \\ 
       & 0.318790423633696 & b & 1.55130311148241 \\ 
      $\backslash$multirow\{2\}\{*\}\{4\} & 0.672622845121449 & a & 6.01311508645727 \\ 
       & 1.09581061308637 & b & 2.99998417729512 \\ 
       \hline
    \end{tabular}
    \end{table}

我想得到这样的东西:

\begin{table}[ht]
\centering
\begin{tabular}{llll}
  \hline
a & b & c & d \\ 
  \hline
   \multirow{2}{*}{1} & 0.567  & a & 17 \\ 
                      & -1.451 & b & 6 \\ 
  \multirow{2}{*}{2}  & 1.190  & a & 1 \\ 
                      & 1.082  & b & 8 \\ 
  \multirow{2}{*}{3}  & 0.771  & a & 5 \\ 
                      & 0.319  & b & 2 \\ 
  \multirow{2}{*}{4}  & 0.673  & a & 6 \\ 
                      & 1.096  & b & 3 \\ 
   \hline
\end{tabular}
\end{table}

包括数字列的不同舍入(打印时使用digits 命令通常可行,但不适用于我的表格)

【问题讨论】:

  • 对于舍入问题,尝试使用data.frame 而不是cbind 创建tab(即tab &lt;- data.frame(a, b, c, d)cbind 创建一个矩阵,这意味着每个值必须相同模式。因此,您的数字被强制转换为字符并且舍入不起作用。如果您从数据框开始,不同的列可以有不同的模式,因此您的数字列将保持数字,xtabledigits 参数将工作。
  • 如果您想要不同列中的不同位数,在运行xtable 之前,将每列四舍五入到您想要的位数并转换为字符,以便xtable 不会用尾随填充零。
  • @eipi10 感谢您的回复!然而,好的一点是,即使在使用 data.frame 时,我也会得到与上面相同的输出。所以肯定还有另一个问题。
  • 所以,有代码可以解决我的问题sanitize.text.function = force,这个打印\multirow{2}{*}{1} 正确。 @eipi10 感谢您的帮助
  • @Adela 如果您将解决方案作为答案发布,偶然发现相同问题的人将不胜感激。另请注意,从您的评论来看,这个选项sanitize.text.function = force 提供给print 函数并不明显,该函数也接受xtable(...),而不是直接提供给xtable 函数。如果你写了一个答案,你可以详细说明这一切,从而帮助别人。

标签: r xtable


【解决方案1】:

解决方案是在print() 函数中为xtable 对象使用sanitize.text.function = force

tab <- data.frame(a, b, c, d)
print(xtable(tab), include.rownames = FALSE, sanitize.text.function = force)

输出:

\begin{table}[ht]
\centering
\begin{tabular}{lrlr}
  \hline
  a & b & c & d \\ 
  \hline
  \multirow{2}{*}{1} &  1.26 & a & 2.43 \\ 
   & -0.42 & b & 3.60 \\ 
  \multirow{2}{*}{2} & -0.14 & a & 6.27 \\ 
   & -0.12 & b & 1.68 \\ 
  \multirow{2}{*}{3} &  0.70 & a & 2.15 \\ 
   & -1.05 & b & 0.62 \\ 
  \multirow{2}{*}{4} &  2.29 & a & 0.84 \\ 
   & -0.21 & b & 3.36 \\ 
   \hline
\end{tabular}
\end{table}

【讨论】:

    猜你喜欢
    • 2010-09-24
    • 2012-10-19
    • 2017-04-09
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多