You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于分组列垂直合并多列(使用flextable实现)

基于分组列合并多列的flextable解决方案

需求:在给定的示例数据中,仅在对应分组(v1列的a、b、c组)内,对v2和v3列进行垂直合并,要求使用flextable包实现。

示例数据

# Sample data
dat <- data.frame(
  v1 = c(rep("a", 3), rep("b", 3), rep("c", 3)),
  v2 = c("G1", "G1", "G2", "G2", "G3", "G3", "G4", "G5", "G6"),
  v3 = c(1, 1, 2, 2, 2, 5, 5, 5, 5),
  v4 = c(1:9), stringsAsFactors = FALSE)

此前不适用的解决方案

  • 方案一:通过虚拟变量实现,但仅支持单列合并,扩展性差
dat$v_dummy <- paste0(dat$v1, dat$v2)
ft <- dat %>% 
  flextable() %>%
  theme_box()
ft <- merge_v(ft, j =c("v1", "v_dummy"), target = c(1:2))
  • 方案二:直接垂直合并分组列,会丢失数据(比如v2列的G2单元格)
ft <- dat %>% 
  flextable() %>%
  theme_box()
ft <- merge_v(ft, j = 1, target = 1:3)

期望效果

期望效果示意图

可行解决方案

核心思路是按分组(v1)+ 待合并列(v2、v3)的组合标记合并范围,然后对每个分组内的重复单元格进行垂直合并:

library(flextable)
library(dplyr)

# 1. 为每个分组内的v2、v3组合标记合并组
dat_merge <- dat %>%
  group_by(v1, v2, v3) %>%
  mutate(
    merge_v2 = cur_group_id(),
    merge_v3 = cur_group_id()
  ) %>%
  ungroup()

# 2. 创建flextable并进行分组内合并
ft <- flextable(dat_merge) %>%
  # 合并v1列的分组单元格
  merge_v(j = "v1", target = ~v1) %>%
  # 按merge_v2标记合并v2列
  merge_v(j = "v2", target = ~merge_v2) %>%
  # 按merge_v3标记合并v3列
  merge_v(j = "v3", target = ~merge_v3) %>%
  # 移除辅助列
  delete_columns(c("merge_v2", "merge_v3")) %>%
  theme_box()

# 查看结果
ft

代码说明

  1. 首先通过group_by(v1, v2, v3)和cur_group_id()生成辅助列,标记每个分组内v2、v3的重复组合,确保仅在同一v1分组内合并相同的v2、v3值;
  2. 使用merge_v()分别对v1、v2、v3列按对应标记列进行垂直合并;
  3. 最后删除辅助列并应用主题,得到符合需求的表格。

内容的提问来源于stack exchange,提问作者DAY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 17:28:18