如何用R的tidyr包pivot_longer实现多时间变量宽表转长表?
用tidyr::pivot_longer实现宽格式转长格式适配LME分析
核心思路
利用pivot_longer的正则分组功能,将带时间后缀的列名拆分为测量变量列和时间点列,同时保留SubjectID、Gender、Age等固定信息列。
步骤示例
1. 模拟匹配你的数据结构的示例数据
library(tidyverse) set.seed(123) df_wide <- tibble( SubjectID = 1:5, Gender = sample(c("Male", "Female"), 5, replace = TRUE), Age = sample(18:60, 5), var1_T1 = rnorm(5), var1_T2 = rnorm(5), var2_T1 = rnorm(5), var2_T2 = rnorm(5), var3_T1 = rnorm(5), var3_T2 = rnorm(5) )
2. 执行宽转长转换
df_long <- df_wide %>% pivot_longer( cols = -c(SubjectID, Gender, Age), # 排除固定信息列,转换剩余列 names_to = c(".value", "TimePoint"), # .value对应测量变量名,TimePoint对应时间标签 names_pattern = "(var\\d+)_(T\\d+)" # 正则拆分列名:第一组是变量名,第二组是时间点 )
3. 关键参数解释
cols:指定要转换的列,用-c(...)排除固定列,比手动列名更灵活names_to = c(".value", "TimePoint"):".value"是特殊关键字,告诉函数将正则匹配的第一组作为新的列名(如var1、var2),第二组作为TimePoint列的取值names_pattern:正则表达式用括号分组,(var\\d+)匹配变量名部分,(T\\d+)匹配时间点部分,下划线作为分隔符
4. 转换后的数据结构
执行后会得到符合LME分析要求的长格式数据,示例输出:
head(df_long)
# A tibble: 10 × 6 SubjectID Gender Age TimePoint var1 var2 var3 <int> <chr> <int> <chr> <dbl> <dbl> <dbl> 1 1 Female 49 T1 -0.560 1.22 0.461 2 1 Female 49 T2 -0.230 0.359 -1.27 3 2 Male 39 T1 1.56 0.401 -0.695 4 2 Male 39 T2 0.0705 0.111 -0.205 5 3 Female 27 T1 0.129 -0.176 1.00 6 3 Female 27 T2 1.72 0.460 0.701
适配不同命名规则
如果你的变量名不是varX_TY格式(比如score_T1、weight_T3),只需调整正则表达式:
# 适配任意字母数字组成的变量名 names_pattern = "(\\w+)_(T\\d+)"
内容的提问来源于stack exchange,提问作者Miquel Bosch Bruguera
相关产品推荐
相关产品推荐

