可重复示例:
我有一个数据框,标有变量来表示使用sjmisc包的单位,从v0.4.2开始,它与dplyr很好地配合使用。
library(dplyr)
library(sjmisc)
library(ggplot2)
data("diamonds")
df= tbl_df(diamonds) %>%
select(cut, carat, color, price) %>%
set_label(c("", "Kt", "Type","EUR")) %>%
slice(1:5)
正如str(df)
所示,它正确包含三列标签:
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 5 obs. of 4 variables:
$ cut : Ord.factor w/ 5 levels "Fair"<"Good"<..: 5 4 2 4 2
$ carat: atomic 0.23 0.21 0.23 0.29 0.31
..- attr(*, "label")= Named chr "Kt"
.. ..- attr(*, "names")= chr "carat"
$ color: Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 2 2 2 6 7
..- attr(*, "label")= Named chr "Type"
.. ..- attr(*, "names")= chr "color"
$ price: atomic 326 326 327 334 335
..- attr(*, "label")= Named chr "EUR"
.. ..- attr(*, "names")= chr "price"
同样使用R-Studio IDE,我可以看到标签View(df)
。
现在,我想使用knitr/rmarkdown/html中的kable
函数通过knitr工具链将此数据框打印为html,其代码为.Rmd
rmarkdown个文件
---
title: "Table with labels"
output: html_document
---
```{r include=FALSE}
library(dplyr)
library(sjmisc)
library(ggplot2)
library(knitr)
data("diamonds")
```
## Example
```{r echo=FALSE, results='asis'}
df= tbl_df(diamonds) %>%
select(cut, carat, color, price) %>%
set_label(c("", "Kt", "Type","EUR")) %>%
slice(1:5)
kable(df)
```
导致html包含下表:
问题:
不幸的是,单位的标签不会用作标题中的第二行。
问题:
如何获得“克拉”下方的“Kt”,“颜色”下方的“类型”和“价格”下方的“EUR”作为第二个标题行?第二行应具有与第一行相同的水平居中。
我正在寻找一种解决方案而无需手动将标签手动添加到第二行,它应该自动将标签应用于打印的表格。如果可能,单位标签的字体大小应比第一行标题行小一点,或者没有粗体字。
如何重写kable
(在这种情况下为html输出)以满足这些要求并与标记数据框一起很好地发挥作用?
答案 0 :(得分:3)
kable
的说明告诉我们
这是一个非常简单的表生成器。它设计简单。它不打算替换任何其他R包来制作表格。
所以我不希望你能直接用kable
做到这一点。但是还有其他选择。它们在冗长,简单和高效方面各不相同。
这是使用pixiedust
包的一种方法。
library(dplyr)
library(sjmisc)
library(ggplot2)
library(pixiedust)
data("diamonds")
df= tbl_df(diamonds) %>%
select(cut, carat, color, price) %>%
set_label(c("", "Kt", "Type","EUR")) %>%
slice(1:5)
Head <- rbind(names(df),
get_label(df)) %>%
as.data.frame(., stringsAsFactors = FALSE)
dust(df) %>%
redust(., Head, part = "head") %>%
sprinkle_print_method("html")
您可以使用pixiedust
包中的其他功能来自定义表的外观(并且可以轻松地将表的格式捆绑到自定义函数中,以便将来更轻松地应用格式化。)< / p>
我确信htmlTables
也可以做到这一点,尽管我对它并不熟练。