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

如何为tidyr::pivot_longer设置names_pattern实现指定宽表转长表

解决方法

你当前的names_to参数设置不符合需求,目标是生成first和last列,需要调整参数并搭配正确的正则表达式作为names_pattern取值:

正确代码及解释

df_wide %>%
  tidyr::pivot_longer(
    cols = -name,
    names_to = c(".value", "group"),
    names_pattern = "(first|last)_name(?:_(\\d+))?"
  ) %>%
  dplyr::select(-group)  # 可选:移除不需要的分组序号列

关键参数说明

  • names_to = c(".value", "group"):
    • .value表示用正则捕获的第一部分(first或last)作为新列名,自动将所有first_name*列合并为first列,last_name*列合并为last列
    • group用来接收捕获的数字序号(对应_1/_2这类后缀),后续可按需移除
  • names_pattern = "(first|last)_name(?:_(\\d+))?":
    • (first|last):捕获列名前缀,区分是名字还是姓氏
    • _name:匹配列名中的固定字符串部分
    • (?:_(\\d+))?:可选匹配带数字的后缀,?:表示外层是非捕获组,\\d+捕获数字序号,?允许这部分不存在(对应无后缀的first_name/last_name列)

简化版(无需保留分组序号)

如果不需要分组序号,也可以用更简洁的正则:

df_wide %>%
  tidyr::pivot_longer(
    cols = -name,
    names_to = ".value",
    names_pattern = "(first|last)_name.*"
  )

这种方式通过匹配first_name或last_name开头的所有列,直接合并为first和last列,适合列顺序固定的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:07:50