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

R语言如何使用pivot_longer将按月拆分的宽格式数据转为长格式

解答

完全可以使用pivot_longer()实现该转换,这是该函数的典型适用场景,具体实现步骤如下:

  • 加载依赖包
    pivot_longer()属于tidyr包,可单独加载tidyr,也可直接加载整合了数据处理全流程功能的tidyverse包:
    library(tidyr)
    # 可选:加载完整tidyverse集合
    # library(tidyverse)
    
  • 确认原始数据格式
    转换前需保证待拉长的指标列命名符合指标名_月份的规则,和你给出的Accrued_Jan、Paid_Feb这类命名一致,id、Country、City三个固定列无需预处理。
    以下是和你描述完全匹配的示例宽表,可对照检查自己的数据集结构:
    # 示例宽格式数据
    wide_data <- data.frame(
      id = 1:2,
      Country = c("China", "United States"),
      City = c("Beijing", "Chicago"),
      Accrued_Jan = c(120, 340),
      Accrued_Feb = c(150, 360),
      Accrued_Mar = c(180, 410),
      Paid_Jan = c(90, 300),
      Paid_Feb = c(130, 320),
      Paid_Mar = c(160, 390)
    )
    
  • 执行宽转长核心代码
    转换的核心逻辑是:选中所有非固定列,将列名按下划线拆分为两部分,第一部分直接作为新的值列列名(即Accrued、Paid),第二部分提取为月份存入新增的Month列,代码如下:
    long_data <- pivot_longer(
      data = wide_data,
      # 选中排除3个固定列外的所有待转换列
      cols = !c(id, Country, City),
      # 拆分列名后,第一部分作为值列名,第二部分存入Month字段
      names_to = c(".value", "Month"),
      # 指定列名的拆分分隔符为下划线
      names_sep = "_"
    )
    
  • 结果校验
    运行后得到的长表将保留id、Country、City三个原始固定列,新增Month列存储Jan、Feb、Mar三类月份值,同时生成Accrued、Paid两个独立列存储对应月份的指标数值,可通过head(long_data)直接查看转换结果。

补充说明:如果你的列名不是以下划线作为分隔符,只需替换names_sep参数为实际分隔符即可;如果列名规则更复杂,可替换为names_pattern参数传入正则表达式匹配拆分规则,你当前的列命名格式用names_sep = "_"是最简洁的实现方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 06:39:32