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

如何用R提取列名末尾年份并将宽数据转换为长格式数据框

R语言宽表转长表:提取列名年份并重构数据框

核心解决方案

我们可以结合tidyr包的pivot_longer()和separate()函数,通过正则匹配或字符串截取的方式提取列名中的年份和指标名称,完成宽表到长表的转换。

方法一:正则分割列名(推荐)

使用正则表达式精准匹配列名末尾的4位年份,一次性拆分出指标列和年份:

library(tidyr)
library(dplyr)

# 执行转换
df_result <- df1 %>%
  # 将除col1外的列转为长格式
  pivot_longer(
    cols = -col1,
    names_to = "temp_col",
    values_to = "指标值"
  ) %>%
  # 按最后一个下划线(后跟4位年份)分割列名
  separate(
    col = temp_col,
    into = c("指标列", "年份"),
    sep = "_(?=\\d{4}$)", # 正则规则:匹配最后一个下划线,后面紧跟4位数字
    extra = "merge"       # 保留指标列中的下划线不被分割
  )

# 查看转换结果
print(df_result)

方法二:字符串截取提取年份

如果列名末尾的年份固定为4位,也可以通过substr()直接截取年份和指标名称:

library(tidyr)
library(dplyr)

df_result2 <- df1 %>%
  pivot_longer(-col1, names_to = "col_name", values_to = "指标值") %>%
  mutate(
    # 提取列名最后4位作为年份
    年份 = substr(col_name, nchar(col_name)-3, nchar(col_name)),
    # 提取年份前的部分作为指标列(去掉最后5位:下划线+4位年份)
    指标列 = substr(col_name, 1, nchar(col_name)-5)
  ) %>%
  # 调整列顺序为需求格式
  select(col1, 年份, 指标列, 指标值)

print(df_result2)

转换后结果

两种方法最终都会生成如下结构的数据框(共8行,每个col1对应4行数据):

# A tibble: 8 × 4
  col1 指标列  年份  指标值
  <chr> <chr>  <chr>  <dbl>
1 a     col2_1 1980  0.168
2 a     col2_1 1981  0.808
3 a     col3_1 1980  0.385
4 a     col3_1 1981  0.328
5 b     col2_1 1980  0.602
6 b     col2_1 1981  0.604
7 b     col3_1 1980  0.125
8 b     col3_1 1981  0.295

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 13:01:55