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

