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

如何用一次tidyr::pivot_longer实现复杂列名的数据宽转长?

解决pivot_longer一次转换数据结构的问题

你的报错原因是正则表达式里存在三个捕获组:((eb\.estimate|se\.rescaled)) 里的外层括号是第一个捕获组,内部的选择分支是第二个,末尾的(\d{4})是第三个。而当names_to=".value"时,要求正则只能有一个捕获组对应要保留的列名前缀,因此触发错误。

要实现一次pivot转换,你可以利用names_to的向量参数,明确指定不同捕获组对应的用途:一个对应列名前缀(.value),一个对应年份列。具体代码如下:

all.data.long <- all.data %>%
  pivot_longer(
    cols = -survey_id,  # 自动选中所有非survey_id的列,更简洁
    names_to = c(".value", "year"),
    names_pattern = "(eb\\.estimate|se\\.rescaled)\\.(\\d{4})"
  ) %>%
  rename(
    eb.est = eb.estimate,
    se = se.rescaled
  )

代码说明:

  • cols = -survey_id:避免手动罗列所有需要转换的列,直接排除不需要变形的survey_id
  • names_to = c(".value", "year"):第一个捕获组的内容(eb.estimate或se.rescaled)作为新的列名,第二个捕获组的内容(年份)作为year列的取值
  • names_pattern:将列名拆分为两部分,第一部分是指标类型,第二部分是年份
  • rename:把原始指标列名重命名为你需要的eb.est和se

执行后就能直接得到你想要的目标数据结构,无需多次pivot再合并。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:54:15