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

如何使用pivot_longer整理含多个体参数的宽格式数据集?

解决宽格式转长格式的最优方法

针对你描述的列名结构(前缀_数字_参数名),可以用tidyr包的pivot_longer函数结合正则表达式一次性完成列名拆分与同类参数合并,具体实现如下:

代码实现

首先加载tidyverse工具集(包含dplyr和tidyr):

library(tidyverse)

然后对示例数据集进行转换:

dataset_long <- dataset_1 %>%
  pivot_longer(
    cols = -ID,  # 保留ID列,转换其余所有列
    names_to = c("Status", ".value"),  # Status存储个体标识(数字),.value对应参数名(fn/ln)
    names_pattern = "^.*_(\\d+)_(.*)$"  # 正则匹配列名结构,捕获数字和参数名
  ) %>%
  mutate(Status = as.integer(Status))  # 可选:将Status转为整数类型

代码解释

  • cols = -ID:明确只转换除ID之外的列,保留每行的原始标识。
  • names_to = c("Status", ".value"):pivot_longer的特殊语法,.value表示这部分捕获的内容将作为新的列名(比如fn、ln),Status则存储从列名中提取的个体数字标识。
  • names_pattern:正则表达式^.*_(\\d+)_(.*)$会匹配任意前缀+下划线+数字+下划线+参数名的结构,其中:
    • ^.*_:匹配前缀部分(包含所有到最后一个下划线前的内容)
    • (\\d+):捕获数字部分,对应Status列
    • (.*):捕获参数名部分,对应.value(即合并后的fn、ln列)

示例输出

转换后的长格式数据集前6行如下:

# A tibble: 15 × 4
      ID Status fn    ln    
   <int>  <int> <chr> <chr> 
 1     1      1 Jill  James 
 2     1      2 Pete  Lil   
 3     1      3 Edy   febe  
 4     2      1 Aliya Troy  
 5     2      2 Edy   adam  
 6     2      3 Jill  tom   

适配复杂前缀场景

如果你的列名前缀包含多个下划线(比如college_collaborator_1_First_name),上述正则表达式依然有效,因为它会匹配到最后一个下划线前的所有内容作为前缀,只提取最后一组下划线后的数字和参数名,无需修改代码。

内容的提问来源于stack exchange,提问作者Maleeha Shahid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:57:47