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

如何将带有多重复合表头的data.frame重塑为指定结构的长表

多重表头宽表转长表的R实现方案

以下为tidyverse生态的通用解决方案,可适配任意层级的复合表头转换需求:

前置准备

建议读取原始数据时设置header = FALSE,避免第一行表头被自动设为列名导致第二、第三层表头丢失。示例使用tidyverse包完成操作:

library(tidyverse)
# 替换为你的本地文件路径即可
df_raw <- read.csv("your_file_path.csv", header = FALSE, stringsAsFactors = FALSE)

步骤1:提取并拼接多层表头

# 提取三层表头的非首列内容(首列对应行维度的name字段,无需额外处理)
level_country <- as.character(df_raw[1, -1]) # 第一层表头:国家维度
level_code <- as.character(df_raw[2, -1]) # 第二层表头:编码维度
level_sector <- as.character(df_raw[3, -1]) # 第三层表头:行业维度

# 用表头中不存在的分隔符拼接三层信息,示例使用|作为分隔符
combined_colnames <- c("name", paste(level_country, level_code, level_sector, sep = "|"))

# 提取实际业务数据(从第4行开始)并设置新列名
df_clean <- df_raw[4:nrow(df_raw), ]
colnames(df_clean) <- combined_colnames

特殊场景适配:如果你的数据已将第一行表头设为列名,只需将level_country替换为colnames(df_raw)[-1],实际数据的起始行对应调整为第3行即可。


步骤2:长表重塑

直接用pivot_longer拆分拼接的列名即可得到目标结构:

df_long <- df_clean %>%
  # 保留首列name,其余列全部转为长格式
  pivot_longer(
    cols = -name,
    # 拆分后对应三个维度字段
    names_to = c("country", "code", "sector"),
    # 匹配之前使用的分隔符,|需要转义
    names_sep = "\\|",
    # 数值列命名为number
    values_to = "number"
  ) %>%
  # 确保数值列为数值格式
  mutate(number = as.numeric(number))

结果验证

输出的df_long将自动包含你需要的5个字段:name、country、code、sector、number,可通过head(df_long)查看转换效果。该方案逻辑可通用,仅需调整表头拼接层级和names_to字段数量,即可适配更多层级的复合表头转换需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 13:18:03