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

R语言如何实现宽格式数据框到指定长格式的转换

R语言数据框宽转长实现方案

你这个场景是典型的宽格式转长格式需求:原始数据中词汇ID(201、202)作为列名存储得分,需要将这两列转换为Word_ID(存储词汇编号)和Score(存储对应得分)两个变量,最后调整排序匹配你需要的Time列排布规律即可。

方法1:tidyr包实现(推荐,代码简洁易读)

这是目前R语言生态中最常用的长宽转换实现,需要加载tidyr和dplyr包:

# 加载依赖包
library(tidyr)
library(dplyr)

# 复现你的原始宽格式数据(自行读入数据可跳过这步)
df_wide <- data.frame(
  Participant = rep(100, 6),
  Time = rep(c(0, 2), each = 3),
  Measure = rep(c("A", "B", "C"), 2),
  `201` = c(0, 1, 0, 1, 1, 1),
  `202` = c(0, 0, 0, 1, 1, 1),
  check.names = FALSE
)

# 执行转换+排序
df_long <- df_wide |> 
  pivot_longer(
    cols = c(`201`, `202`),
    names_to = "Word_ID",
    values_to = "Score",
    names_transform = list(Word_ID = as.integer)
  ) |> 
  arrange(Word_ID, Time, Measure)

运行后输出的df_long完全匹配你给出的目标结构,同Word_ID下Time列会按「0、0、0、2、2、2」规律排布。

方法2:基础R实现(无需安装第三方包)

如果不想安装额外依赖,可以用R自带的reshape函数实现:

df_long_base <- reshape(
  df_wide,
  varying = c("201", "202"),
  v.names = "Score",
  timevar = "Word_ID",
  times = c(201, 202),
  idvar = c("Participant", "Time", "Measure"),
  direction = "long"
)
# 调整顺序匹配目标格式
df_long_base <- df_long_base[order(df_long_base$Word_ID, df_long_base$Time, df_long_base$Measure), ]
rownames(df_long_base) <- NULL

注意事项

  • 如果读入数据时没有设置check.names = FALSE,R会自动给纯数字的列名加X前缀,列名会变成X201、X202,转换时把对应列名改成带X的版本即可。
  • 排序步骤不可省略:宽转长默认会按原始宽表的行逐行拆分,顺序为「同一行的201、202拆成两行再处理下一行」,不会自动按Word_ID分组,只有加了排序步骤才能得到你需要的Time列重复规律。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 07:27:36