如何在R中融合带有两行表头的数据框?
两行表头数据框的融合解决方案
核心思路
先拆分表头信息:把原数据框第一行的内容作为question_code,原列名作为question_number;再提取第二行及以后的内容作为实际数据;最后通过长格式转换工具完成融合,并关联表头信息。
步骤1:提取表头映射并清洗数据
首先把第一行的问题代码提取出来,同时重构数据框保留实际数值和ID/Order信息:
# 提取问题列的编号与对应code的映射表 code_map <- data.frame( question_number = names(data)[1:4], # 取前4个问题列的列名 question_code = as.character(data[1, 1:4]) # 第一行对应的code值 ) # 清洗数据:保留第二行及以后的实际数据,修正列类型 data_clean <- data[-1, ] # 转换ID和Order为字符型(避免因子类型干扰) data_clean$ID <- as.character(data_clean$ID) data_clean$Order <- as.character(data_clean$Order) # 转换问题列为数值型 data_clean[, 1:4] <- lapply(data_clean[, 1:4], as.numeric)
步骤2:用tidyverse的pivot_longer完成融合
如果你习惯使用tidyverse工具链,pivot_longer的语法更直观:
library(tidyverse) # 融合数据并关联表头信息 result <- data_clean %>% # 将问题列转为长格式 pivot_longer( cols = starts_with("Q"), names_to = "question_number", values_to = "response" ) %>% # 关联question_code left_join(code_map, by = "question_number") %>% # 调整列顺序匹配目标格式 select(response, question_code, question_number, ID, Order) %>% # 按问题编号排序 arrange(question_number)
步骤3:用reshape2的melt完成融合
如果你更熟悉reshape2包的melt函数,也可以这样实现:
library(reshape2) # 融合数据 melted_data <- melt( data_clean, id.vars = c("ID", "Order"), variable.name = "question_number", value.name = "response" ) # 关联表头信息并调整列顺序 result <- melted_data %>% left_join(code_map, by = "question_number") %>% select(response, question_code, question_number, ID, Order) %>% arrange(question_number)
最终结果验证
运行上述代码后,result数据框将完全匹配你需要的目标格式:
response question_code question_number ID Order 1 1 abc Q1_1 AA zz 2 2 abc Q1_1 BB ss 3 3 abc Q1_1 CC tt 4 4 abc Q1_1 DD qq 5 2 def Q1_2 AA zz 6 3 def Q1_2 BB ss 7 6 def Q1_2 CC tt 8 2 def Q1_2 DD qq 9 4 ghi Q2_1 AA zz 10 5 ghi Q2_1 BB ss 11 3 ghi Q2_1 CC tt 12 1 ghi Q2_1 DD qq 13 6 jkl Q2_2 AA zz 14 3 jkl Q2_2 BB ss 15 8 jkl Q2_2 CC tt 16 4 jkl Q2_2 DD qq
内容的提问来源于stack exchange,提问作者Siyu Lin
相关产品推荐
相关产品推荐

