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

如何使用pivot_longer对多组同命名规则列完成宽表转长表

原代码问题说明
  • 第一种写法错误:
    拆分逻辑与列赋值完全反向,正则(?=[0-9])会把Time1Day拆分为Time和1Day两部分,你错误地将这两部分赋值给了Day、Month字段,同时未使用.value特殊参数,无法同时生成Day、Month两个独立值列。
  • 第二种写法错误:
    连续两次调用pivot_longer会产生笛卡尔积,相同Time前缀的Day、Month值无法正确匹配,会生成大量重复错误的行。
正确实现代码

核心逻辑是用names_pattern配合.value特殊参数,拆分列名的同时自动生成对应的值列:

df.long <- df %>%
  pivot_longer(
    cols = starts_with("Time"),
    names_to = c("Time", ".value"),
    names_pattern = "(Time\\d)(Day|Month)",
    values_drop_na = TRUE
  )

参数说明

  • names_pattern设置两个捕获组,第一个组(Time\\d)匹配Time1/Time2/Time3这类时间标识,对应赋值给names_to的第一个参数Time,生成Time列
  • 第二个捕获组(Day|Month)匹配度量类型,对应names_to的.value参数,系统会自动将匹配到的内容作为新的值列名,把对应数值分别存入Day、Month列
  • values_drop_na = TRUE自动过滤掉Time3中id-3的NA行,输出结果与你的预期完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:36:03