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

使用dplyr与stubs重塑数据:宽表转长表代码问题求助

R语言宽表转长表:修正pivot_longer代码实现目标转换

原始数据与目标结果

DATA=data.frame(    
  STUDENT =c(1, 2, 3),    
  GRADE1 =c(7, 3, NA),   
  GRADE2 =c(6, 5, 9),    
  GRADE3 =c(4, NA, 2),   
  GYM1   =c(2, 0, NA),   
  GYM2   =c(9, 7, 7),    
  GYM3   =c(1, NA, 6)
)   

DATAWANT = data.frame(  
  STUDENT =c(1, 1, 1, 2, 2, 3, 3),    
  TIME =c(1, 2, 3, 1, 2, 2, 3),    
  GRADE =c(7, 6, 4, 3, 5, 9, 2),    
  GYM =c(2, 9, 1, 0, 7, 7, 6)
)

原代码问题分析

  1. names_to参数逻辑错误:你试图直接将列名映射到GRADE和GYM,但pivot_longer需要先拆分列名为「指标类型」和「时间标记」两个部分,再通过.value关键字将指标类型转为新列名。
  2. 正则表达式不匹配:原始列名是GRADE1、GYM1这类无下划线的格式,你写的正则包含下划线和Grade字符串,完全无法匹配目标内容。

修正后的代码

library(tidyr)
library(dplyr)

DATAWANT.CORRECT <- DATA %>%
  pivot_longer(
    cols = -STUDENT,
    # .value表示将匹配的前缀作为新列名,TIME提取数字部分
    names_to = c(".value", "TIME"),
    # 正则匹配:非数字前缀(GRADE/GYM)+ 数字后缀(1/2/3)
    names_pattern = "(\\D+)(\\d+)",
    # 自动删除含NA的行,匹配目标结果
    values_drop_na = TRUE
  ) %>%
  # 将TIME转为整数类型,和目标数据格式一致
  mutate(TIME = as.integer(TIME))

运行上述代码后,DATAWANT.CORRECT的结构和内容与DATAWANT完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 07:47:05