如何使用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
相关产品推荐
相关产品推荐

