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

如何在R中正确重塑宽表数据?现有pivot_longer代码输出异常

解决data.frame宽表转长表的pivot_longer错误问题

你的原始数据列名存在两种不一致的命名模式,导致原pivot_longer代码的正则表达式无法匹配所有列,进而得到错误结果:

  • 模式1:前缀+数字+字母(如Course1A、Time1A)
  • 模式2:前缀+字母+数字(如TimeC3、ScoreC3)

原代码中的names_pattern = "([A-Za-z]+)([0-9]+[A-Z])"仅能匹配模式1,无法覆盖模式2的列,因此转换失败。

正确转换代码

library(tidyverse)

# 宽表转长表,适配两种列名模式
reshaped_data <- data %>% 
  pivot_longer(
    cols = -c(ID, Gender, Race, Health),
    names_to = c(".value", "Group"),
    # 正则表达式匹配两种列名模式的前缀与标识部分
    names_pattern = "([A-Za-z]+)([0-9]+[A-Z]|[A-Z][0-9]+)"
  ) %>%
  # 保留目标列,移除临时生成的Group列
  select(ID, Course, Time, Gender, Race, Health, Score)

代码说明

  1. 正则表达式调整:([0-9]+[A-Z]|[A-Z][0-9]+)部分同时匹配"数字+字母"和"字母+数字"两种标识格式,确保所有Course/Time/Score开头的列都能被正确分组。
  2. 列筛选:通过select保留你需要的7列,去掉转换过程中生成的Group辅助列。

验证结果

执行head(reshaped_data)可查看转换后的前几行长格式数据,每个ID会对应8条课程记录,结构完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 13:30:39