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

如何在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

关键步骤说明

  1. 选择目标变量:starts_with("g")自动筛选所有以g开头的年级相关变量,确保ID、Gender等非目标变量原样保留。
  2. 变量名拆分规则:
    • names_to = c("grade", ".value"):将变量名拆分为两部分,grade存储年级标识(如k、1、2),.value表示剩余部分作为新的列名(如treadss、tmathss、trace)。
    • names_pattern = "^g([0-9k])(.*)$":正则表达式精准匹配变量名结构,捕获年级和指标信息。如果你的数据包含更多年级(如gk3),可将正则调整为^g([0-9k]+)(.*)$。
  3. 格式适配:如果需要统一年级显示格式(如将k转换为0),可添加mutate(grade = ifelse(grade == "k", "0", grade))调整。

结果验证

转换后的数据集将完全符合你期望的长格式:每个学生的每一年级对应一行,包含ID、Gender、各指标列和grade标识,完美支持后续固定效应分析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:35:09