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
相关产品推荐
相关产品推荐

