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

如何将含不同下划线变量名的宽DataFrame转换为长格式?

处理含多下划线变量名的宽表转长表需求

示例数据

example <- data.frame(
  date = as.Date(c('2001-01-01',
                   '2001-01-02',
                   '2001-01-01',
                   '2001-01-02')),
  PID_A = c(1091, 1091, 1037, 1037),
  PID_B = c(2091, 2091, 2037, 2037),
  resp_A = c(3,1,2,4),
  resp_B = c(2,4,3,1),
  xxx_connect_A = c(6,2,5,3),
  xxx_connect_B = c(5,3,6,2)
)

期望输出

example_solution <- data.frame(
  date = as.Date(rep(c('2001-01-01',
                       '2001-01-02'),4)),
  PID = c(1091, 1091, 2091, 2091, 1037, 1037, 2037, 2037),
  resp = c(3,1,2,4,2,4,3,1),
  xxx_connect = c(6,2,5,3,5,3,6,2)
)

问题分析

原尝试用pivot_longer按下划线分割,但部分变量名含多个下划线(比如xxx_connect_A),导致分割逻辑错误,无法正确提取变量主体和后缀标识(A/B)。

解决方案

使用pivot_longer的names_pattern参数,通过正则表达式匹配最后一个下划线后的后缀,精准区分变量主体和分组标识:

library(tidyr)

example |>
  pivot_longer(
    -date,
    names_to = c(".value", "who"),
    names_pattern = "(.*)_(A|B)$"
  ) |>
  select(-who)  # 可选:移除不需要的分组标识列,完全匹配期望输出

逻辑解释

  • names_pattern = "(.*)_(A|B)$":正则表达式规则为:
    • (.*):捕获最后一个下划线前的所有字符,作为变量主体(对应.value,即生成的新列名,如PID、xxx_connect)
    • (A|B):捕获下划线后的A/B标识,对应临时列who
  • 执行select(-who)可移除临时分组列,得到与期望一致的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:01:29