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

如何将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分组拆分数据,再将拆分后的表格横向合并,并构建多层列名。具体步骤如下:

  1. 按id分组,为每组添加行索引(用于合并时对齐行)
  2. 将数据宽转长,再转回宽格式,让每个ID的变量成为独立列组
  3. 构建双层列名(主表头为ID,子表头为变量名)
  4. 可选:调整输出格式匹配需求的展示样式

完整代码实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 19:53:12