如何用R将重复测量设计的宽格式数据转换为长格式?
重复测量宽格式转长格式(多指标)解决方案
问题背景
现有3条件重复测量数据为宽格式,包含被试ID、各条件下的3个测量指标(nombre/jugement_causal/confiance)、人口学信息等字段。需要转换为长格式:每个被试对应3行,每行对应一个条件,保留所有测量指标及不变字段,用于导入Jamovi分析。此前用gather处理单个指标可行,但多指标转换时出现重复行问题。
原始数据结构
df <- structure(list(num_pp = c(1, 2, 3, 4, 5, 6), nombre_dp1 = c(24, 14, 2, 6, 6, 21), nombre_dp05 = c(20, 28, 2, 9, 8, 21), nombre_dp0 = c(24, 20, 4, 11, 8, 20), jugement_causal_dp1 = c("Oui", "Oui", "Oui", "Oui", "Oui", "Oui"), jugement_causal_dp05 = c("Non", "Oui", "Non", "Non", "Oui", "Non"), jugement_causal_dp0 = c("Non", "Non", "Oui", "Non", "Non", "Non"), confiance_dp1 = c(90, 80, 63, 80, 90, 80), confiance_dp05 = c(60, 50, 86, 65, 50, 90), confiance_dp0 = c(65, 60, 55, 43, 50, 80), age = c(33, 22, 20, 20, 18, 18), genre = c("Masculin", "Feminin", "Feminin", "Feminin", "Feminin", "Feminin"), etude = c("L1", "L1", "L1", "L1", "L1", "L1"), ordre = c("dp_05|dp_1|dp_0", "dp_0|dp_1|dp_05", "dp_0|dp_1|dp_05", "dp_0|dp_05|dp_1", "dp_1|dp_05|dp_0", "dp_1|dp_05|dp_0" ), wdif_dp1dp05 = c(-4, 14, 0, 3, 2, 0)), row.names = c(NA, -6L ), class = c("tbl_df", "tbl", "data.frame"))
解决方案:使用tidyr::pivot_longer
pivot_longer是gather的替代函数,支持一次性处理多组重复测量变量,避免重复行问题。
步骤1:加载必要包
# 未安装则先运行:install.packages(c("tidyr", "dplyr")) library(tidyr) library(dplyr)
步骤2:宽转长核心代码
data_long <- df %>% pivot_longer( cols = matches("_dp[015]"), # 选中所有带条件后缀的测量变量 names_to = c(".value", "condition"), # .value保留原指标名,condition存条件标签 names_pattern = "(.*)_(dp.*)" # 正则拆分变量名:指标名 + 条件后缀 )
代码解释
cols = matches("_dp[015]"):自动匹配所有变量名含_dp0/_dp1/_dp05的列,无需手动逐个列名输入names_to = c(".value", "condition"):特殊参数.value表示将变量名的第一部分(如nombre)作为新列名,第二部分(如dp1)存入condition列names_pattern = "(.*)_(dp.*)":正则表达式拆分变量名,比如jugement_causal_dp05会被拆分为jugement_causal(指标)和dp05(条件)
转换后结果
每个被试(num_pp)对应3行,每行对应一个条件,包含nombre/jugement_causal/confiance三个测量指标,以及age/genre等不变字段,完全适配Jamovi的重复测量分析要求。
查看前6行示例:
head(data_long)
输出示例:
# A tibble: 6 × 9 num_pp age genre etude ordre wdif_dp1dp05 condition nombre jugement_causal confiance <dbl> <dbl> <chr> <chr> <chr> <dbl> <chr> <dbl> <chr> <dbl> 1 1 33 Masculin L1 dp_05|dp_1|dp_0 -4 dp1 24 Oui 90 2 1 33 Masculin L1 dp_05|dp_1|dp_0 -4 dp05 20 Non 60 3 1 33 Masculin L1 dp_05|dp_1|dp_0 -4 dp0 24 Non 65 4 2 22 Feminin L1 dp_0|dp_1|dp_05 14 dp1 14 Oui 80 5 2 22 Feminin L1 dp_0|dp_1|dp_05 14 dp05 28 Oui 50 6 2 22 Feminin L1 dp_0|dp_1|dp_05 14 dp0 20 Non 60
内容的提问来源于stack exchange,提问作者liz
相关产品推荐
相关产品推荐

