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

如何使用tidyr::pivot_longer()整理多组关联列?

问题描述

我需要将数据框中的两组列整理为新的列,同时保留行数据的关联结构。多次使用tidyr::gather()无法维持这种列间关联,tidyr::pivot_longer()看似能满足需求,但我在参数设置上遇到了障碍。此前见过类似问题的解决方案,但用到了grep重命名列,我无法理解,而且这里应该不需要额外重命名操作。

示例数据:

library(tidyverse)

df <- data.frame(
  Position=1:5,
  A_Width=3:7,
  B_Width=4:8,
  A_Error=seq(0, 2.0, 0.5),
  B_Error=seq(0.3, 1.5, 0.3)
)

期望得到的长格式数据框:

df_long <- data.frame(
  Position=rep(1:5,2),
  Group=c(rep("A",5), rep("B",5)),
  Width=c(3:7,4:8),
  Error=c(seq(0, 2.0, 0.5), seq(0.3, 1.5, 0.3))
)
解决方案

使用tidyr::pivot_longer()的多组捕获功能,通过正则表达式拆分列名,直接生成目标结构:

df_long <- df %>%
  tidyr::pivot_longer(
    cols = -Position,  # 排除不需要转换的Position列
    names_to = c("Group", ".value"),  # 拆分列名为分组和指标列名
    names_pattern = "(.*)_(.*)"       # 正则捕获下划线前后的分组与指标
  )

参数解释

  • cols = -Position:指定除Position外的所有列参与转换,比手动罗列列更简洁
  • names_to = c("Group", ".value"):
    • Group:存储从列名中提取的分组标识(A/B)
    • .value:特殊关键字,代表这部分对应新的列名(Width/Error),原始列的值会填充到对应列中
  • names_pattern = "(.*)_(.*)":正则表达式的两个捕获组,分别匹配下划线分隔的两部分内容,完美适配你列名的命名规则

运行后得到的结果与你期望的df_long完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 18:05:14