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

R语言宽表转长表:含双时间变量的格式转换需求

解决方案(R语言宽表转长表)

首先构造你的示例数据:

df <- data.frame(
  CODE = c(1, 12, 8),
  NAME = c("A", "B", "C"),
  M_2010_1 = c(10, 11, 9),
  M_2011_1 = c(11, 13, 2),
  M_2012_1 = c(10, 15, 4),
  M_2010_3 = c(9, 15, 2),
  M_2011_3 = c(10, 14, 8),
  M_2012_3 = c(13, 11, 8)
)

使用tidyr+dplyr的组合完成转换:

library(tidyr)
library(dplyr)

result <- df %>%
  # 将所有M_开头的列转为长格式,列名存入key,数值存入value
  pivot_longer(cols = starts_with("M_"), names_to = "key", values_to = "value") %>%
  # 拆分key列,按下划线分隔出前缀、年份、月份标识
  separate(key, into = c("prefix", "YEAR", "month"), sep = "_") %>%
  # 将月份标识转为列名(M1、M3),对应填充数值
  pivot_wider(names_from = month, values_from = value, names_prefix = "M") %>%
  # 整理列顺序并移除无用列
  select(CODE, NAME, YEAR, M1, M3) %>%
  # 把YEAR转为整数类型(可选,按需调整)
  mutate(YEAR = as.integer(YEAR))

print(result)

运行后得到的结果与你期望的长格式完全一致:

CODE NAME YEAR M1 M3
1    1    A 2010 10  9
2    1    A 2011 11 10
3    1    A 2012 10 13
4   12    B 2010 11 15
5   12    B 2011 13 14
6   12    B 2012 15 11
7    8    C 2010  9  2
8    8    C 2011  2  8
9    8    C 2012  4  8

步骤说明

  1. pivot_longer:把宽表中所有年份-月份相关的列压缩成key(列名)和value(数值)两列,为拆分年份、月份做准备。
  2. separate:从key列中拆分出年份(YEAR)和月份标识(1/3),实现信息拆解。
  3. pivot_wider:把拆分后的月份标识转为并列的M1、M3列,让同一年份的两个数值在同一行展示。
  4. select+mutate:调整列的顺序,并将YEAR转为整数类型,优化数据格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:45:42