如何在R中将大型宽格式DataFrame转换为长格式?
多组宽格式转长格式解决方案
针对你的需求,我们可以利用tidyverse中的pivot_longer函数,通过正则表达式批量拆分变量名,一次性完成多组指标的宽转长转换,同时保留非目标变量不受影响。
完整代码实现
library(tidyverse) # 加载示例数据 d <- tibble( ID = c(1231, 1232, 1233, 1234), Gender = c(1, 2, 2, 1), gktreadss = c(500, 533, 616, 599), g1treadss = c(506, 533, 668, 677), g2treadss = c(590, 690, 789, 555), gktmathss = c(600, 655, 655, 665), g1tmathss = c(NA, 667, 556, 688), g2tmathss = c(NA, 700, 688, 789), gktrace = c(1, 2, 1, 1), g1trace = c(2, 1, 1, 2), g2trace = c(1, 1, 1, 1) ) # 批量宽转长处理 long_d <- d %>% pivot_longer( cols = starts_with("g"), # 选中所有需转换的年级相关变量 names_to = c("grade", ".value"), # 拆分变量名为年级标识+指标列名 names_pattern = "^g([0-9k])(.*)$" # 正则匹配:提取年级(数字/k)和指标名 ) # 查看转换结果 long_d
关键步骤说明
- 选择目标变量:
starts_with("g")自动筛选所有以g开头的年级相关变量,确保ID、Gender等非目标变量原样保留。 - 变量名拆分规则:
names_to = c("grade", ".value"):将变量名拆分为两部分,grade存储年级标识(如k、1、2),.value表示剩余部分作为新的列名(如treadss、tmathss、trace)。names_pattern = "^g([0-9k])(.*)$":正则表达式精准匹配变量名结构,捕获年级和指标信息。如果你的数据包含更多年级(如gk3),可将正则调整为^g([0-9k]+)(.*)$。
- 格式适配:如果需要统一年级显示格式(如将
k转换为0),可添加mutate(grade = ifelse(grade == "k", "0", grade))调整。
结果验证
转换后的数据集将完全符合你期望的长格式:每个学生的每一年级对应一行,包含ID、Gender、各指标列和grade标识,完美支持后续固定效应分析。
内容的提问来源于stack exchange,提问作者T L
相关产品推荐
相关产品推荐

