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

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。

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 13:54:09