You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 16:05:29