如何基于分组列垂直合并多列(使用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
代码说明
- 首先通过
group_by(v1, v2, v3)和cur_group_id()生成辅助列,标记每个分组内v2、v3的重复组合,确保仅在同一v1分组内合并相同的v2、v3值; - 使用
merge_v()分别对v1、v2、v3列按对应标记列进行垂直合并; - 最后删除辅助列并应用主题,得到符合需求的表格。
内容的提问来源于stack exchange,提问作者DAY
相关产品推荐
相关产品推荐

