r - 如何在 R Markdown 中将每列的最小值加粗每个单元格

标签 r r-markdown kable kableextra

我想将我的一个数据框的最小值加粗,并将其合并为一个。我希望每列中的最小值加粗。

下面的 R 代码显示了我的最低工作示例 (MWE)。该表由五 (5) 列从正态分布中随机生成的值组成。前三 (3) 个显示 std dev =1 时,后三 (3) 个显示 std dev =2 时。每列根据其生成种子及其std dev而有所不同。

---
title: "Min Value to be Bolded"
output:  pdf_document
---

```{r}
set.seed(1)
df1 <- data.frame(
  seed1 = rnorm(5, mean = 0, sd = 1),
  seed2 = rnorm(5, mean = 0, sd = 1),
  seed3 = rnorm(5, mean = 0, sd = 1)
)
set.seed(1)
df2 <- data.frame(
  seed1 = rnorm(5, mean = 0, sd = 2),
  seed2 = rnorm(5, mean = 0, sd = 2),
  seed3 = rnorm(5, mean = 0, sd = 2)
)
df <- cbind(df1, df2)
df |>
  knitr::kable(format = "html", table.attr = "style='width:100%;'", digits = 2, align = 'c', caption = "5 Random Numbers from the Normal Dist at diff set and std dev") |>
  kableExtra::kable_styling(bootstrap_options = 'bordered') |>
  kableExtra::add_header_above(c('$sd = 1$' = 3, '$sd$ = 2' = 3)) |>
  row_spec(3, bold=T, hline_after = TRUE)
```

输出looks like this

而不是我来获取最小值粗体。我把第三行全部加粗了。我可以像这样获取 R 上的值:

lapply(df1, 2, FUN = min)

但我需要有关如何使用 kablekableExtral 将单元格加粗的帮助。

请注意,我并不是要对整个数据框执行此操作,我只需要 df1df2

最佳答案

您可以添加库(formattable),然后

df |> 
  lapply(\(x){ifelse(x == min(x), cell_spec(round(x,2), bold = TRUE), round(x,2))}) |>
  knitr::kable(format = "html", table.attr = "style='width:100%;'", digits = 2, align = 'c', 
                caption = "5 Random Numbers from the Normal Dist at diff set and std dev", 
                escape = FALSE) |>
  kableExtra::kable_styling(bootstrap_options = 'bordered') |>
  kableExtra::add_header_above(c('$sd = 1$' = 3, '$sd$ = 2' = 3))

或者,如果您只想要df1,您可以从

开始
df1 |> lapply(\(x){ifelse(x == min(x), cell_spec(round(x, 2), bold = TRUE), round(x, 2))}) |> cbind(df2) |> 

对于df2

df1 |> cbind(df2 |> lapply(\(x){ifelse(x == min(x), cell_spec(round(x, 2), bold = TRUE), round(x, 2))})) |>

备注:在我的解决方案中,数据帧的名称全部变为 x。您可以在 lapply 之后添加 as.data.frame 来获取原始名称,但在这种情况下,它们会发生变化,因为 df 具有名称重复,这不是一个合适的做法。相反,使用 col.names 您可以编写所需的名称,例如

df |> 
  lapply(\(x){ifelse(x == min(x), cell_spec(round(x,2), bold = TRUE), round(x,2))}) |>
  as.data.frame() |>
  knitr::kable(format = "html", table.attr = "style='width:100%;'", digits = 2, align = 'c', 
               caption = "5 Random Numbers from the Normal Dist at diff set and std dev", 
               escape = FALSE, col.names = rep(c("seed1", "seed2", "seed3"), 2)) |>
  kableExtra::kable_styling(bootstrap_options = 'bordered') |>
  kableExtra::add_header_above(c('$sd = 1$' = 3, '$sd$ = 2' = 3)) 

enter image description here

另请注意,作为评论@phiver,我必须将 output: pdf_document 修改为 output: html_document,否则代码将无法工作。要获得 pdf,代码的最后几行应如下所示(然后它就可以工作):

  knitr::kable(format = "latex",  digits = 2, align = 'c', 
               caption = "5 Random Numbers from the Normal Dist at diff set and std dev", 
               escape = FALSE, col.names = rep(c("seed1", "seed2", "seed3"), 2)) |>
  kableExtra::kable_styling(bootstrap_options = 'bordered', full_width = TRUE) |>
  kableExtra::add_header_above(c('$sd = 1$' = 3, '$sd$ = 2' = 3)) 

关于r - 如何在 R Markdown 中将每列的最小值加粗每个单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68846322/

相关文章:

r - 在 R 中合并 netCDF 文件

r 如何将 mapply 与数据表一起使用

r - 在 R-Markdown 输出中换行没有空格

css - 如何在 rmarkdown 中编辑 bootstrap 主题?

r - kable:垂直对齐不适用于 pdf 输出

r-markdown - RMarkdown - 使用 kable 的表格中的不同字体类型?

r - 在 ggplot2/R 中添加指数 geom_smooth

r - 即使对于 ggplot2 中的重叠区域,相同/修复 alpha

r - 函数返回 Rmarkdown 图中并排打印的多个绘图,而不是一个在另一个之上

r - 在 kable() 的数字中的每个数字添加逗号