R语言使用pivot_longer处理列名含中间编号的宽转长问题
实现方案
完整可运行的转换代码如下:
library(tidyr) library(dplyr) # 构造输入数据 datInput <- tibble(id = 1:2, c.0.opt = c("a,b", "c,d"), c.0.optI = c("1,2", "3,4"), c.0.sel = c("a", "c"), c.1.opt = c("e,f", "g,h"), c.1.optI = c("5,6", "7,8"), c.1.sel = c("e", "g")) # 执行宽转长 datOutput <- datInput %>% pivot_longer( cols = -id, # 正则拆分列名:两个捕获组分别匹配序号、属性名 names_pattern = "^c\\.(\\d+)\\.(.+)$", names_to = c("group_id", ".value"), # 自动给属性名加上c_前缀,匹配目标列名规范 names_transform = list(.value = ~paste0("c_", .x)) ) %>% # 移除仅用于对齐分组的中间列 select(-group_id)
核心参数配置说明
cols = -id:划定转换范围,仅排除作为唯一标识的id列,所有c.数字.属性结构的列都会被纳入转换流程names_pattern:通过正则的两个捕获组适配中间带数字的特殊列名结构:- 第一捕获组
(\\d+)匹配列名中间的数字序号,用于标记同组属性的归属 - 第二捕获组
.+匹配列名末尾的任意属性名,无需硬编码固定属性值,场景适配性更强
- 第一捕获组
names_to = c("group_id", ".value"):利用pivot_longer的特殊标识.value简化转换逻辑:.value代表对应捕获组的内容将直接作为新长表的列名group_id列仅用于把同序号下的多属性值对齐到同一行,无需在最终结果中保留
names_transform:对作为列名的属性值做格式调整,自动拼接c_前缀,直接匹配目标结构的列名要求,省略手动重命名步骤
内容的提问来源于stack exchange,提问作者Gaborio。
相关产品推荐
相关产品推荐

