R package xtable, как создать латинский с несколькими строками и столбцами из R
Моя цель - создать латентную запись с функциями multirow/multicolumn из R.
Я хотел бы, чтобы это было похоже:
colLabel | colLabel2
|
a1 a2 | a3 a4
-------------------------------------
b1 1 2 | 5 6
rowLabel1 |
b2 3 4 | 7 8
--------------------------------------
b3 9 10 | 13 14
rowLabel2 |
b4 11 12 | 15 16
--------------------------------------
В настоящее время я использую xtable, но я не могу понять, как создать мультирум, используя этот пакет.
Может ли кто-нибудь сказать мне, как создать такую таблицу?
Заранее благодарю
Ответы
Ответ 1
Вам нужно будет уточнить, что именно вы пытаетесь вложить в таблицу, но я думаю, что функция tabular
из пакета tables
может быть полезна.
Здесь приведен пример средства табуляции переменной в соответствии с 4 двоичными переменными фактора:
mydf <- data.frame(rowFactor1 = sample(letters[1:2], 100, replace = TRUE),
colFactor1 = sample(LETTERS[1:2], 100, replace = TRUE),
x = rnorm(100),
rowFactor2 = sample(1:2, 100, replace = TRUE),
colFactor2 = sample(1:2, 100, replace = TRUE))
tab1 <- tabular(Heading()*RowFactor(rowFactor2, spacing = 1,
levelnames = c("rowLabel1", "rowLabel2"))*
Heading()*RowFactor(rowFactor1,
levelnames = c("b1", "b2")) ~
Heading()*Factor(colFactor2,
levelnames = c("colLabel1", "colLabel2") )*
Heading()*Factor(colFactor1,
levelnames = c("a1", "a2"))*
Heading()*(x)*Heading()*(mean),
data = mydf)
который дает вам что-то вроде этого, но красиво формируется при использовании выхода латекса
colLabel1 colLabel2
a1 a2 a1 a2
\\nopagebreak rowLabel1 \\nopagebreak b1 -0.1450 0.2633 0.91454 0.1222
\\nopagebreak b2 -0.1499 -0.4290 -0.09706 -0.6977
\\rule{0pt}{1.7\\normalbaselineskip}rowLabel2 \\nopagebreak b1 0.6976 -0.4888 -0.68492 1.6764
\\nopagebreak b2 -0.2369 -0.1428 -0.66405 0.9469
Наконец latex(tab1)
дает вам латексный код:
\begin{tabular}{llcccc}
\hline
& & \multicolumn{2}{c}{colLabel1} & \multicolumn{2}{c}{colLabel2} \\
& & a1 & a2 & a1 & \multicolumn{1}{c}{a2} \\
\hline
\nopagebreak rowLabel1 & \nopagebreak b1 & $-0.1450$ & $\phantom{-}0.2633$ & $\phantom{-}0.91454$ & $\phantom{-}0.1222$ \\
& \nopagebreak b2 & $-0.1499$ & $-0.4290$ & $-0.09706$ & $-0.6977$ \\
\rule{0pt}{1.7\normalbaselineskip}rowLabel2 & \nopagebreak b1 & $\phantom{-}0.6976$ & $-0.4888$ & $-0.68492$ & $\phantom{-}1.6764$ \\
& \nopagebreak b2 & $-0.2369$ & $-0.1428$ & $-0.66405$ & $\phantom{-}0.9469$ \\
\hline
\end{tabular}
Ответ 2
Я просто хотел бы указать на комбинацию записи блока Кристофа (здесь) и ответа Gabor в списке почтовых ящиков (здесь) работает с пакетом xtable
. Кроме того, это решение способно объединять ячейки по методу \multirow
.
Здесь идет MWE:
require(xtable)
# set up data frame
df <- data.frame(c(replicate(2, c("L1")), replicate(2, c("L2"))),
replicate(4, "b"),
replicate(4, runif(4, 1, 10)) )
# only needed if first column consists of numbers
df[[1]] <- as.character(df[[1]])
rle.lengths <- rle(df[[1]])$lengths
first <- !duplicated(df[[1]])
df[[1]][!first] <- ""
# define appearance of \multirow
df[[1]][first] <-
paste0("\\midrule\\multirow{", rle.lengths, "}{*}{\\textbf{", df[[1]][first], "}}")
strCaption <- paste0("\\textbf{Table Whatever} This table is just produced with some ",
"random data and does not mean anything. Just to show you how ",
"things work.")
# set up xtable output
print(xtable(df, digits = c(0, 0, 0, 3, 1, 0, 6), # first zero "represents" row numbers which we skip later
align = "lllrr|rr", # align and put a vertical line (first "l" again represents column of row numbers)
caption = strCaption, label = "testTable"),
size = "footnotesize", #Change size; useful for bigger tables "normalsize" "footnotesize"
include.rownames = FALSE, #Don't print rownames
include.colnames = FALSE, #We create them ourselves
caption.placement = "top", #"top", NULL
hline.after=NULL, #We don't need hline; we use booktabs
floating=TRUE, # whether \begin{Table} should be created (TRUE) or not (FALSE)
sanitize.text.function = force, # Important to treat content of first column as latex function
add.to.row = list(pos = list(-1,
2,
nrow(df)),
command = c(paste("\\toprule \n", # NEW row
"\\multicolumn{2}{c}{} & \\multicolumn{2}{c}{\\textbf{colLabel1}} & \\multicolumn{2}{c}{colLabel2} \\\\\n",
"\\cmidrule(l){3-4} \\cmidrule(l){5-6}\n",
" & & a1 & a2 & a3 & a4 \\\\\n", # NEW row
"\\midrule \n"
),
paste("\\cmidrule(l){3-4} \\cmidrule(l){5-6}\n" # we may also use 'pos' and 'command' to add a midrule
),
paste("\\bottomrule \n" # paste is used as it is more flexible regarding adding lines
)
)
)
)
Которая вставляет следующую таблицу в LaTeX:
![введите описание изображения здесь]()
Ответ 3
Рассмотрим kableExtra
package.
\documentclass{article}
\usepackage{booktabs}
\usepackage{multirow}
\usepackage[table]{xcolor}
\begin{document}
<<setup, include=FALSE>>=
library(knitr)
opts_chunk$set(echo=FALSE)
library(kableExtra)
options(knitr.table.format = "latex")
dat <- data.frame(
group = c("rowLabel1", "rowLabel1", "rowLabel2", "rowLabel2"),
a1 = c(1, 3, 9, 11),
a2 = c(2, 4, 10, 12),
a3 = c(5, 7, 13, 15),
a4 = c(6, 8, 14, 16)
)
@
<<results='asis'>>=
kable(dat, booktabs = TRUE, caption = "My table", escape = FALSE) %>%
add_header_above(c(" ", "colLabel1"=2, "colLabel2"=2)) %>%
kable_styling(latex_options = "hold_position") %>%
column_spec(1, bold=TRUE) %>%
collapse_rows(columns = 1)
@
\end{document}
![введите описание изображения здесь]()
Ответ 4
Я не могу помочь с заголовками столбцов, но для нескольких значений строк в прошлом я обманул. Функция ниже устанавливает второй и последующие наборы одного и того же значения в NA, а xxtable затем не отображает их, поэтому вы получаете что-то, что выглядит неопределенно, как многострочное значение (с верхним выравниванием)
cleanf <- function(x){
oldx <- c(FALSE, x[-1]==x[-length(x)])
# is the value equal to the previous?
res <- x
res[oldx] <- NA
return(res)}
Ответ 5
Вот как это сделать с пакетом huxtable
(я автор):
library(huxtable)
mydf <- data.frame(rowFactor1 = sample(letters[1:2], 100, replace = TRUE),
colFactor1 = sample(LETTERS[1:2], 100, replace = TRUE),
x = rnorm(100),
rowFactor2 = sample(1:2, 100, replace = TRUE),
colFactor2 = sample(1:2, 100, replace = TRUE))
tbl <- ftable(colFactor1 + colFactor2 ~ rowFactor1 + rowFactor2, data = mydf)
ht <- as_hux(tbl)
rowspan(ht)[c(4, 6), "V1"] <- 2 # these cells span 2 rows
colspan(ht)[1, c(4, 6)] <- 2 # these cells span 2 columns
ht[3, 1:2] <- '' # clean up some extraneous colum names
ht[1:2, 3] <- ''
right_border(ht)[,3] <- 1
bottom_border(ht)[c(2, 5, 7), ] <- 1
bottom_border(ht)[c(4,6), 1] <- 1
ht
При печати в LaTeX это выглядит так:
![huxtable pic]()