使用R语言gather()处理多变量转长数据出错,求解决方案
解决宽转长的多变量转换问题
你的核心问题是separate的拆分逻辑错误:你把列名拆成了column, obj_number, familiarity,但实际列名结构是[指标(rt/acc)]_[对象编号]_[熟悉度(fam/nov)](比如rt_1_fam),拆分顺序应该对应指标、对象编号、熟悉度,这直接导致对象名称无法正确提取。另外你缺失了「对象编号→对象名称」的映射步骤,所以没生成目标里的对象名称变量。
修正后的代码
library(tidyverse) l <- p %>% # 收集所有待转换列,列名存为组合字段,值存为value gather(metric_obj_fam, value, 4:11, 14:25) %>% # 按下划线拆分组合列名,对应指标、对象编号、熟悉度 separate(metric_obj_fam, into = c("metric", "obj_num", "familiarity"), sep = "_") %>% # 将指标字段展开为rt和acc列 spread(metric, value) %>% # 把对象编号映射为实际名称(按你的目标数据对应关系) mutate( obj_name = case_when( obj_num == "1" ~ "car", obj_num == "2" ~ "bear", obj_num == "3" ~ "bus", obj_num == "4" ~ "iguana", obj_num == "5" ~ "seal", obj_num == "6" ~ "wagon", TRUE ~ NA_character_ ) ) %>% # 调整列顺序匹配目标格式(可选) select(subj, age_group, gender, obj_num, obj_name, familiarity, rt, acc)
关键细节说明
separate必须指定sep="_",确保按列名里的下划线准确拆分,顺序要和列名结构完全对应- 用
case_when完成编号到对象名称的映射,这是你之前缺失的核心步骤 - 如果列名的分隔符不是下划线,只需修改
sep参数为对应符号即可
内容的提问来源于stack exchange,提问作者Lissy
相关产品推荐
相关产品推荐

