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

R语言数据框格式转换:实现词ID为行、测试项为列的重构

R语言数据框格式转换实现方案

你需要的转换是典型的长宽表互转操作,不要尝试找一步完成的函数,拆成「先把词汇列转成行、再把测试类型转成独立列」两步走,逻辑最清晰也不容易出错,下面给两种最常用的实现方式:


方法1:tidyverse 方案(推荐初学者使用,代码逻辑直观)

核心用tidyr包的pivot_longer(长表转换)和pivot_wider(宽表转换)两个函数,代码可读性强,是目前R语言数据清洗的主流用法:

# 首次使用先运行安装命令:install.packages("tidyverse")
library(tidyverse)

# 构造示例原始数据,你实际使用时替换为自己读入的数据框即可
df_raw <- tibble(
  Participant = c(100,100,100,101,101,101),
  Test = c("Test1","Test2","Test3","Test1","Test2","Test3"),
  `201` = c(0,1,1,0,1,1),
  `202` = c(0,1,0,0,0,1),
  `203` = c(1,1,1,1,1,0)
)

# 核心转换代码
df_result <- df_raw %>%
  # 第一步:把201/202/203三个词汇列转换为长格式,生成Word_ID列
  pivot_longer(
    cols = c(`201`, `202`, `203`),
    names_to = "Word_ID",
    values_to = "score"
  ) %>%
  # 第二步:把Test列的不同取值拆分为独立列,填充对应得分
  pivot_wider(
    names_from = Test,
    values_from = score
  ) %>%
  # 可选:如果需要列名带空格和你给出的目标结构完全一致,加这步重命名
  rename(`Test 1` = Test1, `Test 2` = Test2, `Test 3` = Test3)

运行后得到的结果和你给出的目标结构完全一致。


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

如果不想额外安装扩展包,用R自带的reshape函数也能实现同样效果:

# 第一步:先把词汇列转为长格式
df_long <- reshape(
  df_raw,
  varying = c("201", "202", "203"),
  v.names = "score",
  timevar = "Word_ID",
  times = c("201", "202", "203"),
  direction = "long"
)

# 第二步:把测试类型转为宽格式列
df_result <- reshape(
  df_long,
  idvar = c("Participant", "Word_ID"),
  timevar = "Test",
  direction = "wide"
)

# 清理列名和行名,和目标结构对齐
names(df_result) <- gsub("score\\.", "", names(df_result))
row.names(df_result) <- NULL

初学者小提示

优先掌握pivot_longer/pivot_wider这两个函数即可,参数命名直白好记,后续做数据汇总、清洗的绝大多数场景都能用到,比基础R的变形函数上手快很多。

内容的提问来源于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 01:49:15