在 kableExtra 中使用 cell_spec 时,使 table 中的 NA 值只是空白单元格
Make NA values in table just blank cells when using cell_spec in kableExtra
继 a previous question 之后,我正在使用 kableExtra 中的 cell_spec
函数来更改 table 中单元格的背景颜色.您如何删除 NA 文本并将 NA 单元格的背景着色为白色,以便 NA 显示为空白单元格?
下面是我使用 NA 单元格的示例 table。在现实生活中,列数是动态的,每列中有不同数量的 NA。
---
output: pdf_document
---
```{r setup, include=FALSE}
library(kableExtra)
library(dplyr)
knitr::opts_chunk$set(echo = TRUE)
set.seed(2)
d <- data_frame(group = sample(LETTERS[1:5], 10, replace=TRUE), cat1=runif(10, 0, 100), cat2=runif(10, 0, 100))
d[3:5,2:3] <- NA
# Functions used to create color palette
max.val <- max(d[ , sapply(d, is.numeric)], na.rm=TRUE)
pal.fnc <- colorRamp(c("red", "yellow", "green"))
d <- d %>%
mutate_if(is.numeric, function(x) {
cell_spec(round(x,1), "latex", bold = F, color=grey(.3),
background = rgb(pal.fnc(x/max.val) %>% replace(., is.na(.), 200), maxColorValue=255))
})
```
```{r table, echo = FALSE}
kable(d,
linesep = "",
booktabs = T,
escape = F )
```
您可以控制 knitr options(knitr.kable.NA = '')
来抑制 NA,但是这在这里不起作用,因为您正在用 \cellcolor[HTML]{C8C8C8}{\textcolor[HTML]{4D4D4D}{NA}}"
的值覆盖 NA。
为了使 options(knitr.kable.NA = '')
行工作,我们必须在非 NA 值上仅 运行 控制 cell_spec
函数,并防止它添加额外的 HTML 代码到 NA 值。我们可以在 dplyr 到 中使用 case_when
,这样 NA 就不会受到影响。为了便于阅读,我创建了一个函数 colourCell
,然后在创建 table:
之前在 mutate_if
语句中使用该函数
---
output: pdf_document
---
```{r setup, include=FALSE}
library(kableExtra)
library(dplyr)
options(knitr.kable.NA = '')
# Create Data
set.seed(2)
d <- data_frame(group = sample(LETTERS[1:5], 10, replace=TRUE), cat1=runif(10, 0, 100), cat2=runif(10, 0, 100))
d[3:5,2:3] <- NA
# Functions to format cell
max.val = max(d[ , sapply(d, is.numeric)], na.rm=TRUE)
pal.fnc <- colorRamp(c("red", "yellow", "green"))
colourCell <- function(x) {
cell_spec(round(x,1), "latex",
bold = F,
color=grey(.3),
background = rgb(pal.fnc(x/max.val) %>%
replace(., is.na(.), 200), maxColorValue=255))
}
```
```{r table, echo = FALSE}
d %>%
mutate_if(is.numeric, function(x) {
case_when(!is.na(x) ~ colourCell(x))
}) %>%
kable(
linesep = "",
booktabs = T,
escape = F)
```
继 a previous question 之后,我正在使用 kableExtra 中的 cell_spec
函数来更改 table 中单元格的背景颜色.您如何删除 NA 文本并将 NA 单元格的背景着色为白色,以便 NA 显示为空白单元格?
下面是我使用 NA 单元格的示例 table。在现实生活中,列数是动态的,每列中有不同数量的 NA。
---
output: pdf_document
---
```{r setup, include=FALSE}
library(kableExtra)
library(dplyr)
knitr::opts_chunk$set(echo = TRUE)
set.seed(2)
d <- data_frame(group = sample(LETTERS[1:5], 10, replace=TRUE), cat1=runif(10, 0, 100), cat2=runif(10, 0, 100))
d[3:5,2:3] <- NA
# Functions used to create color palette
max.val <- max(d[ , sapply(d, is.numeric)], na.rm=TRUE)
pal.fnc <- colorRamp(c("red", "yellow", "green"))
d <- d %>%
mutate_if(is.numeric, function(x) {
cell_spec(round(x,1), "latex", bold = F, color=grey(.3),
background = rgb(pal.fnc(x/max.val) %>% replace(., is.na(.), 200), maxColorValue=255))
})
```
```{r table, echo = FALSE}
kable(d,
linesep = "",
booktabs = T,
escape = F )
```
您可以控制 knitr options(knitr.kable.NA = '')
来抑制 NA,但是这在这里不起作用,因为您正在用 \cellcolor[HTML]{C8C8C8}{\textcolor[HTML]{4D4D4D}{NA}}"
的值覆盖 NA。
为了使 options(knitr.kable.NA = '')
行工作,我们必须在非 NA 值上仅 运行 控制 cell_spec
函数,并防止它添加额外的 HTML 代码到 NA 值。我们可以在 dplyr 到 case_when
,这样 NA 就不会受到影响。为了便于阅读,我创建了一个函数 colourCell
,然后在创建 table:
mutate_if
语句中使用该函数
---
output: pdf_document
---
```{r setup, include=FALSE}
library(kableExtra)
library(dplyr)
options(knitr.kable.NA = '')
# Create Data
set.seed(2)
d <- data_frame(group = sample(LETTERS[1:5], 10, replace=TRUE), cat1=runif(10, 0, 100), cat2=runif(10, 0, 100))
d[3:5,2:3] <- NA
# Functions to format cell
max.val = max(d[ , sapply(d, is.numeric)], na.rm=TRUE)
pal.fnc <- colorRamp(c("red", "yellow", "green"))
colourCell <- function(x) {
cell_spec(round(x,1), "latex",
bold = F,
color=grey(.3),
background = rgb(pal.fnc(x/max.val) %>%
replace(., is.na(.), 200), maxColorValue=255))
}
```
```{r table, echo = FALSE}
d %>%
mutate_if(is.numeric, function(x) {
case_when(!is.na(x) ~ colourCell(x))
}) %>%
kable(
linesep = "",
booktabs = T,
escape = F)
```