xtable с различными типами столбцов

Я пытаюсь использовать 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 при печати, но не работает для моей таблицы)


person Adela    schedule 26.04.2016    source источник
comment
Для решения проблемы округления попробуйте создать tab, используя data.frame, а не cbind (т. е. tab <- data.frame(a, b, c, d). cbind создает матрицу, что означает, что все значения должны иметь один и тот же режим. Таким образом, ваши числа приводятся к символам, и округление не работает. Если вы начинаете с фрейма данных, разные столбцы могут иметь разные режимы, поэтому ваши числовые столбцы останутся числовыми, а аргумент digits для xtable будет работать.   -  person eipi10    schedule 26.04.2016
comment
Если вы хотите, чтобы в разных столбцах было разное количество цифр, перед запуском xtable округлите каждый столбец до нужного количества цифр и преобразуйте в символ, чтобы xtable не дополнялось конечными нулями.   -  person eipi10    schedule 26.04.2016
comment
@eipi10 Спасибо за ответ! Однако хороший момент, даже при работе с data.frame я получаю тот же результат, что и выше. Значит, должна быть другая проблема.   -  person Adela    schedule 26.04.2016
comment
Что, если вы сделаете, например: tab <- data.frame(a, b, c, d); tab$b = as.character(sprintf("%1.3f", tab$b)); tab$d = as.character(sprintf("%1.0f", tab$d)); print(xtable(tab), include.rownames = FALSE)   -  person eipi10    schedule 26.04.2016
comment
Или это: tab <- data.frame(a, b, c, d); print(xtable(tab, digits=3), include.rownames = FALSE).   -  person eipi10    schedule 26.04.2016
comment
@eipi10 eipi10 Ну, первый работает вполне нормально, но это будет не очень приятно, если учесть большее количество столбцов и / или другое количество цифр округления. Решение для округления состоит в использовании digits= c(0, 0, 3, 0, 0). Однако это не решает проблему латексной команды. Все еще получайте $\backslash$multirow\{2\}\{*\}\{1\} вместо \multirow{2}{*}{1}   -  person Adela    schedule 26.04.2016
comment
Итак, есть код, который решает мою проблему sanitize.text.function = force, этот код печатает \multirow{2}{*}{1} правильно. @eipi10 Спасибо за помощь   -  person Adela    schedule 26.04.2016
comment
@Adela Люди, столкнувшиеся с той же проблемой, будут признательны, если вы опубликуете свое решение в качестве ответа. Также обратите внимание, что из вашего комментария не очевидно, что эта опция sanitize.text.function = force предоставляется функции print, которая также принимает xtable(...), а не непосредственно функции xtable. Если написать ответ, то можно все это уточнить и тем самым помочь другим.   -  person 0range    schedule 10.09.2019


Ответы (1)


Решение состоит в том, чтобы использовать sanitize.text.function = force в функции print() для объекта xtable.

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}
person Adela    schedule 17.09.2019