如何从数据帧列表中打印格式化(kable)表?

How to print formated (kable) tables from a list of dataframes?

提问人:Pedro Neves 提问时间:11/6/2023 最后编辑:MarkPedro Neves 更新时间:11/7/2023 访问量:52

问:

我有一个由数据帧组成的列表,我想将每个列表元素打印为我的 Rmarkdown 文件上的 knitr 表。但是,我需要在将每个数据帧上的单元格传递给 kable() 之前对其进行格式化。

基本上,我需要根据一个条件(如果单元格值为 1,则为红色,如果为零,则为白色)格式化每个数据帧中单元格的背景,然后他们将每个数据帧打印为表格(书签样式)。

我正在使用以下代码,但表格未使用 booktabs 选项进行格式化:

library(tidyverse)
library(knitr)
library(kableExtra)


df1 <- data.frame("2016"=c(0,0,1,1), "2017"=c(1,1,1,1), "2018"=c(0,0,1,0), "2019"=c(1,0,0,0))
 
df2 <- data.frame("2016"=c(0,1,0,1), "2017"=c(1,0,0,1), "2018"=c(1,0,1,0), "2019"=c(1,0,1,1))
   

rownames(df1) <- c("sp1", "sp2", "sp3", "sp4")
rownames(df2) <- c("sp1", "sp2", "sp3", "sp4")

df.list <- list(df1,df2)

map(df.list, ~.x %>% mutate(across(everything(), ~cell_spec(., "html", background = ifelse(.x==1,  "red","white"), color = ifelse(.x==1, "red","white")))) %>% kable("html",  escape = F, booktabs = TRUE))

在我的块选项中,我有:

{r echo=FALSE, message=FALSE, warning=FALSE, eval=TRUE, results = "asis"}

似乎没有评估其中的选项......kable

有什么提示吗?

提前致谢:

佩德罗·内维斯

R list 针织 Kable

评论

0赞 Tom 11/6/2023
能帮助你回答你的问题吗?
0赞 Pedro Neves 11/6/2023
嗨,汤姆:我不认为它有,或者至少,我不能将它应用于我的数据。我会继续寻找选项,但我似乎接近我的方法(如果我能弄清楚我的代码中有什么问题......
0赞 RKeithL 11/7/2023
@PedroNeves,这不是一个解决方案,但(我希望)这是一个开始:df1 %>% mutate_all(~cell_spec(.x, background = ifelse(.x == 1, "red","white"))) %>% kable(escape = F, booktabs = T) %>% kable_styling(bootstrap_options = c("striped", "hover"))

答:

1赞 Peter 11/7/2023 #1

您似乎正在混合 html 和 LaTeX。

该参数用于 LaTeX 输出。所以这可能是你要找的:booktabs

---
output: pdf_document
---

```{r include=FALSE}

library(dplyr)
library(purrr)
library(kableExtra)


df1 <- data.frame("2016"=c(0,0,1,1), "2017"=c(1,1,1,1), "2018"=c(0,0,1,0), "2019"=c(1,0,0,0))
 
df2 <- data.frame("2016"=c(0,1,0,1), "2017"=c(1,0,0,1), "2018"=c(1,0,1,0), "2019"=c(1,0,1,1))

rownames(df1) <- c("sp1", "sp2", "sp3", "sp4")
rownames(df2) <- c("sp1", "sp2", "sp3", "sp4")

df.list <- list(df1,df2)

```


   

```{r results='asis'}

map(df.list, ~.x |>  mutate(across(everything(), ~cell_spec(., "latex", background = ifelse(.x==1,  "red","white"), color = ifelse(.x==1, "red","white")))) |>  
      kbl(escape = FALSE,
            booktabs = TRUE))

```

输出如下:

enter image description here

注意:调用中的数值变量是“自动”给定的“语法有效”名称。因此,如果您希望将年份作为变量名称,可能需要做一些整理或使用。data.frame()tibble()

评论

0赞 Pedro Neves 11/7/2023
非常感谢@Peter。这很有帮助。