Я пытаюсь использовать 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
при печати, но не работает для моей таблицы)
tab
, используяdata.frame
, а неcbind
(т. е.tab <- data.frame(a, b, c, d)
.cbind
создает матрицу, что означает, что все значения должны иметь один и тот же режим. Таким образом, ваши числа приводятся к символам, и округление не работает. Если вы начинаете с фрейма данных, разные столбцы могут иметь разные режимы, поэтому ваши числовые столбцы останутся числовыми, а аргументdigits
дляxtable
будет работать. - person eipi10   schedule 26.04.2016xtable
округлите каждый столбец до нужного количества цифр и преобразуйте в символ, чтобыxtable
не дополнялось конечными нулями. - person eipi10   schedule 26.04.2016tab <- 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.2016tab <- data.frame(a, b, c, d); print(xtable(tab, digits=3), include.rownames = FALSE)
. - person eipi10   schedule 26.04.2016digits= c(0, 0, 3, 0, 0)
. Однако это не решает проблему латексной команды. Все еще получайте$\backslash$multirow\{2\}\{*\}\{1\}
вместо\multirow{2}{*}{1}
- person Adela   schedule 26.04.2016sanitize.text.function = force
, этот код печатает\multirow{2}{*}{1}
правильно. @eipi10 Спасибо за помощь - person Adela   schedule 26.04.2016sanitize.text.function = force
предоставляется функцииprint
, которая также принимаетxtable(...)
, а не непосредственно функцииxtable
. Если написать ответ, то можно все это уточнить и тем самым помочь другим. - person 0range   schedule 10.09.2019