如何在 R 中使用 kableExtra 动态添加组行标签

How to dynamically add group row labels with kableExtra in R

提问人:Ben_89 提问时间:10/8/2023 更新时间:10/8/2023 访问量:26

问:

我有一个数据帧(下面的示例),我想使用 R 中的包将其放入 HTML 表中。我的一列 () 是一个分组变量,我想用它来在表中添加组行标签。我知道我可以使用 中的函数来做到这一点,但我想知道是否有某种方法可以动态地做到这一点。例如,我在示例数据集中有三个唯一的字符串值,我可以轻松调用三个函数并提供相应的索引(第一个值和平均值行)。但是,我可能并不总是有三个唯一的字符串(例如,有时我可能有两个、四个或五个),并且在我的真实数据集中,每个组的行数/观测值数会发生变化。由于我想使用它来生成报告,我希望有一个技巧可以以某种方式自动化此过程。谢谢。kableExtrapospack_rows()kableExtrapospack_rows()pos

library(tidyverse)
library(kableExtra)

set.seed(10)
name <- paste("Name", LETTERS[1:15])
var1 <- rep(rnorm(15, 100, 20))
var2 <- rep(rnorm(15, 100, 20))
var3 <- rep(rnorm(15, 100, 20))
var4 <- rep(rnorm(15, 100, 20))
pos <- c(rep("DEF", 5), rep("MID", 5), rep("FWD", 5))

df <- data.frame(name, var1, var2, var3, var4, pos)

agg_df <- bind_rows(
  df,
  df %>% group_by(pos) %>%
    summarise_at(vars(var1:var4), mean) %>%
      mutate(name = "mean")
  ) %>% 
  arrange(pos, name)

agg_df %>%
  kbl() %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                fixed_thead = TRUE)
r kableextra

评论


答:

2赞 stefan 10/8/2023 #1

一种选择是通过 使用或添加标题行。为此,我首先创建一个包含组和行以及组的列表。Reducepurrr::reducepack_rows()startendlabel

library(dplyr, warn = FALSE)
library(kableExtra)

row_groups <- agg_df |>
  mutate(row = row_number()) |>
  select(pos, row) |>
  split(~pos) |>
  lapply(\(x) {
    data.frame(
      label = unique(x$pos),
      start = min(x$row),
      end = max(x$row)
    )
  })

agg_df |>
  select(-pos) |>
  kbl() |>
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    fixed_thead = TRUE
  ) |>
  Reduce(
    \(x, y) pack_rows(x, y$label, y$start, y$end),
    x = row_groups,
    init = _
  )

enter image description here