R 可反应分组列以编程方式

prd*_*l99 2 r reactable

我在 R 中有这个数据集。我想用 R 包重新转换它。

dt <-
  data.table(
    month = seq(1, 12),
    aa_2019 = seq(1, 12),
    bb_2019 = seq(1, 12),
    
    aa_2020 = seq(1, 12),
    bb_2020 = seq(1, 12),
    
    aa_2021 = seq(1, 12),
    bb_2021 = seq(1, 12),
    
    aa_2022 = seq(1, 12),
    bb_2022 = seq(1, 12)
)
Run Code Online (Sandbox Code Playgroud)

所需的输出如下所示。有没有办法自动制作?想象一下从 1900 年到 2023 年的年份序列。

reactable(
  dt,
  columns = list(
    aa_2019 = colDef(name = "aa"),
    bb_2019 = colDef(name = "bb"),
    
    aa_2020 = colDef(name = "aa"),
    bb_2020 = colDef(name = "bb"),
    
    aa_2021 = colDef(name = "aa"),
    bb_2021 = colDef(name = "bb"),
    
    aa_2022 = colDef(name = "aa"),
    bb_2022 = colDef(name = "bb")
  ),
  columnGroups = list(
    colGroup(name = "2019", columns = c("aa_2019", "bb_2019")),
    colGroup(name = "2020", columns = c("aa_2020", "bb_2020")),
    colGroup(name = "2021", columns = c("aa_2021", "bb_2021")),
    colGroup(name = "2022", columns = c("aa_2022", "bb_2022"))
  )
)
Run Code Online (Sandbox Code Playgroud)

ste*_*fan 5

这是动态创建colDefs 和colGroups 的一种方法:

library(reactable)

cols <- names(dt)[-1]
cols_split <- strsplit(cols, "_")

cols <- data.frame(
  name = cols,
  group = sapply(cols_split, `[[`, 1),
  year = sapply(cols_split, `[[`, 2)
)

col_defs <- lapply(
  cols$group,
  \(x) {
    colDef(name = x)
  }
) |>
  setNames(cols$name)

col_groups <- cols |>
  split(~year) |>
  lapply(\(x) {
    colGroup(name = unique(x$year), columns = x$name)
  }) |> 
  unname()

reactable(
  dt,
  columns = col_defs,
  columnGroups = col_groups
)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述