R kable/kableExtra,按百分比进行条件格式化(有缺失值)
R kable/kableExtra, conditional formatting by percentage (with missing values)
我正在使用 kable 和 kableExtra 并想显示一个 table 和百分比列(格式为“95%”)。我还想根据百分比值(具有多种颜色和切割点)对单元格背景进行条件格式化。另外,还有少量的NA混入。
我尝试了中的一些方法,但不喜欢cell_spec不遮挡整个单元格的背景阴影,所以更愿意使用column_spec凯布尔内。但是,我发现显示百分比的所有选项都将百分比转换为字符变量,这限制了我执行条件格式设置的能力。
当我在这里将我的示例代码简化为 post 时(经过几个小时的错误),我终于使用 startWith 让它工作了(在这种情况下这是一个不错的解决方案,因为我的分割点是 80 % 和 90%,但并不适用于所有情况。
df <- tibble(
x=c(1:6),
percents =c (1, .95, .82, .77, .62, NA)
)
df$percents <- percent(df$percents, accuracy = 1)
kable(df, booktabs=TRUE, escape=FALSE ) %>%
kable_styling() %>%
column_spec(2, background = if_else(startsWith(df$percents, '100'), "Darkgrey",
if_else(startsWith(df$percents, '9'), "Darkgrey",
if_else(startsWith(df$percents, '8'), "silver", "lightgray",
"white"), "white"), "white"))
我很好奇是否有人对此有另一种解决方案,可以保留将百分比值作为数字而不是字符来使用的能力。
谢谢!
为标签创建一个单独的列并使用case_when
与数字进行比较。
library(knitr)
library(kableExtra)
df <- tibble::tibble(
x=c(1:6),
percents =c (1, .95, .82, .77, .62, NA)
)
df$percent_label <- scales::percent(df$percents, accuracy = 1)
kable(df[-2], booktabs=TRUE, escape=FALSE ) %>%
kable_styling() %>%
column_spec(2, background = case_when(df$percents > 0.9 ~ 'darkgrey',
df$percents > 0.8 ~ 'silver',
is.na(df$percents) ~ 'white',
TRUE ~ 'lightgray'))
我们可以使用 formattable::percent
来保持 type
完整
df$percents = formattable::percent(df$percents, digits = 0)
kable(df, booktabs=TRUE, escape=FALSE ) %>%
kable_styling() %>%
column_spec(2, background = case_when(df$percents > 0.9 ~ 'darkgrey',
df$percents > 0.8 ~ 'silver',
is.na(df$percents) ~ 'white',
TRUE ~ 'lightgray'))
数据
df <- tibble::tibble(
x=c(1:6),
percents =c (1, .95, .82, .77, .62, NA)
)
我正在使用 kable 和 kableExtra 并想显示一个 table 和百分比列(格式为“95%”)。我还想根据百分比值(具有多种颜色和切割点)对单元格背景进行条件格式化。另外,还有少量的NA混入。
我尝试了
当我在这里将我的示例代码简化为 post 时(经过几个小时的错误),我终于使用 startWith 让它工作了(在这种情况下这是一个不错的解决方案,因为我的分割点是 80 % 和 90%,但并不适用于所有情况。
df <- tibble(
x=c(1:6),
percents =c (1, .95, .82, .77, .62, NA)
)
df$percents <- percent(df$percents, accuracy = 1)
kable(df, booktabs=TRUE, escape=FALSE ) %>%
kable_styling() %>%
column_spec(2, background = if_else(startsWith(df$percents, '100'), "Darkgrey",
if_else(startsWith(df$percents, '9'), "Darkgrey",
if_else(startsWith(df$percents, '8'), "silver", "lightgray",
"white"), "white"), "white"))
我很好奇是否有人对此有另一种解决方案,可以保留将百分比值作为数字而不是字符来使用的能力。
谢谢!
为标签创建一个单独的列并使用case_when
与数字进行比较。
library(knitr)
library(kableExtra)
df <- tibble::tibble(
x=c(1:6),
percents =c (1, .95, .82, .77, .62, NA)
)
df$percent_label <- scales::percent(df$percents, accuracy = 1)
kable(df[-2], booktabs=TRUE, escape=FALSE ) %>%
kable_styling() %>%
column_spec(2, background = case_when(df$percents > 0.9 ~ 'darkgrey',
df$percents > 0.8 ~ 'silver',
is.na(df$percents) ~ 'white',
TRUE ~ 'lightgray'))
我们可以使用 formattable::percent
来保持 type
完整
df$percents = formattable::percent(df$percents, digits = 0)
kable(df, booktabs=TRUE, escape=FALSE ) %>%
kable_styling() %>%
column_spec(2, background = case_when(df$percents > 0.9 ~ 'darkgrey',
df$percents > 0.8 ~ 'silver',
is.na(df$percents) ~ 'white',
TRUE ~ 'lightgray'))
数据
df <- tibble::tibble(
x=c(1:6),
percents =c (1, .95, .82, .77, .62, NA)
)