如何将tibble的id列设为主表头、原变量列设为子表头
问题:将tibble按ID拆分并实现双层表头横向排列
原始数据生成代码:
id <- c('id_1', 'id_1', 'id_1', 'id_1', 'id_2', 'id_2', 'id_2', 'id_2') var1 <- round(runif(n = 8, min = 0, max = 10), 4) var2 <- round(runif(n = 8, min = 0, max = 10), 4) var3 <- round(runif(n = 8, min = 0, max = 10), 4) var4 <- round(runif(n = 8, min = 0, max = 10), 4) tbl <- tibble(id, var1, var2, var3, var4)
原始数据结构:
# A tibble: 8 × 5 id var1 var2 var3 var4 <chr> <dbl> <dbl> <dbl> <dbl> 1 id_1 1.62 6.36 9.69 2.44 2 id_1 6.10 8.49 8.37 7.75 3 id_1 1.28 7.58 7.03 9.43 4 id_1 5.71 4.94 0.0167 10.0 5 id_2 7.75 0.836 9.31 2.36 6 id_2 1.38 2.35 2.94 6.01 7 id_2 0.560 6.63 3.51 4.04 8 id_2 1.9 9.29 0.230 1.83
需求:生成带有双层表头的表格——主表头为id_1、id_2,子表头为var1-var4,横向排列对应ID的所有行数据。
解决思路与实现
要实现这种双层表头的横向排列,核心是按ID分组拆分数据,再将拆分后的表格横向合并,并构建多层列名。具体步骤如下:
- 按
id分组,为每组添加行索引(用于合并时对齐行) - 将数据宽转长,再转回宽格式,让每个ID的变量成为独立列组
- 构建双层列名(主表头为ID,子表头为变量名)
- 可选:调整输出格式匹配需求的展示样式
完整代码实现
library(tidyverse) # 生成原始数据 id <- c('id_1', 'id_1', 'id_1', 'id_1', 'id_2', 'id_2', 'id_2', 'id_2') var1 <- round(runif(n = 8, min = 0, max = 10), 4) var2 <- round(runif(n = 8, min = 0, max = 10), 4) var3 <- round(runif(n = 8, min = 0, max = 10), 4) var4 <- round(runif(n = 8, min = 0, max = 10), 4) tbl <- tibble(id, var1, var2, var3, var4) # 数据处理流程 result <- tbl %>% # 按ID分组,添加行号用于行对齐 group_by(id) %>% mutate(row_num = row_number()) %>% ungroup() %>% # 宽转长,统一变量格式 pivot_longer(cols = starts_with("var"), names_to = "var", values_to = "value") %>% # 转回宽格式,生成ID-变量的列结构 pivot_wider(names_from = c(id, var), values_from = value) %>% # 移除辅助行号列 select(-row_num) # 构建双层列名 col_names <- str_split_fixed(colnames(result), "_", 2) colnames(result) <- col_names attr(result, "names") <- list(col_names[,1], col_names[,2]) # 查看结果 print(result, row.names = FALSE)
输出格式调整
如果需要更贴近示例中的分隔线样式,可转换为数据框后格式化输出:
# 格式化输出为带对齐的文本样式 as.data.frame(result) %>% format(justify = "right", digits = 4) %>% print(row.names = FALSE)
内容的提问来源于stack exchange,提问作者Mia Lua
相关产品推荐
相关产品推荐

