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

如何在R中将多行合并为列名并转换为长格式DataFrame?

在R中合并表头并转换为长格式DataFrame的实现方法

完全可以在R中实现需求,下面分别给出使用tidyverse工具链(含dplyr)和基础R的具体实现步骤:

一、使用tidyverse(dplyr+tidyr)实现

步骤1:导入数据并处理列名

首先假设你用readxl包导入Excel文件,由于前3行是表头相关信息,导入时不指定默认列名:

library(readxl)
library(tidyverse)

# 导入数据,不读取默认表头
df <- read_excel("你的文件路径.xlsx", col_names = FALSE)

# 合并前3行作为新列名(用下划线分隔,可根据需求调整分隔符)
new_colnames <- apply(df[1:3, ], 2, function(x) paste(x, collapse = "_"))

# 删除前3行元数据,设置新列名
df <- df[-c(1:3), ]
colnames(df) <- new_colnames

步骤2:转换为目标长格式

通过pivot_longer转长格式,拆分合并后的列名,再转宽得到Home/Work独立列:

df_final <- df %>%
  # 将宽格式转为长格式,把所有列整合为"combined"列和数值列
  pivot_longer(cols = everything(), names_to = "combined", values_to = "value") %>%
  # 拆分合并列名为Region、City、类型(Home/Work)、年份
  separate(combined, into = c("Region", "City", "Type", "Year"), sep = "_") %>%
  # 将Type列的Home/Work转为独立列
  pivot_wider(names_from = Type, values_from = value) %>%
  # 转换数据类型(根据实际数据调整)
  mutate(Year = as.integer(Year),
         Home = as.numeric(Home),
         Work = as.numeric(Work))

二、使用基础R实现

步骤1:处理列名

同样先导入数据并合并前3行作为列名:

library(readxl)

df <- read_excel("你的文件路径.xlsx", col_names = FALSE)

# 合并前3行生成新列名
new_colnames <- apply(df[1:3, ], 2, paste, collapse = "_")
df <- df[-c(1:3), ]
colnames(df) <- new_colnames

步骤2:转换为目标长格式

用基础R的reshape函数完成格式转换,拆分列名并整理:

# 转长格式
df_long <- reshape(df, 
                   direction = "long",
                   varying = names(df),
                   v.names = "value",
                   timevar = "combined",
                   times = names(df))

# 拆分合并列名
split_cols <- strsplit(as.character(df_long$combined), "_")
df_long$Region <- sapply(split_cols, "[", 1)
df_long$City <- sapply(split_cols, "[", 2)
df_long$Type <- sapply(split_cols, "[", 3)
df_long$Year <- sapply(split_cols, "[", 4)
df_long$combined <- NULL  # 删除多余列

# 转宽得到Home/Work独立列
df_final <- reshape(df_long,
                    direction = "wide",
                    idvar = c("Region", "City", "Year"),
                    timevar = "Type",
                    v.names = "value")

# 清理列名并转换数据类型
colnames(df_final) <- gsub("value\\.", "", colnames(df_final))
df_final$Year <- as.integer(df_final$Year)
df_final$Home <- as.numeric(df_final$Home)
df_final$Work <- as.numeric(df_final$Work)

注意事项

  • 上述代码假设合并后的列名结构为Region_City_Type_Year,如果你的实际列名结构不同,需要调整separate或strsplit的分隔符、拆分后的字段顺序。
  • 数据类型转换步骤可根据实际数据的格式调整(比如如果年份是字符型无需转整数)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:25:33