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

如何基于列名中的年份数值创建year列?纵向数据格式调整求助

宽格式转长格式:拆分年份列并创建year字段

你现在需要把这种宽格式数据转成长格式,也就是把带年份的列拆分成标识字段和年份字段,同时把对应年份的GDP数值整合到一列里。下面是两种常用实现方法:

方法一:用tidyverse的pivot_longer(推荐)

tidyverse里的pivot_longer是处理这类格式转换最直观的工具,代码可读性强,灵活度高。

假设你的数据框名为df,代码如下:

library(tidyverse)

# 转换格式并拆分列名
df_long <- df %>%
  pivot_longer(
    cols = starts_with("gdpPercap_"),  # 选中所有以gdpPercap_开头的列
    names_to = c("indicator", "year"), # 拆分后的两个字段名
    names_sep = "_",                   # 用下划线作为拆分分隔符
    values_to = "gdpPercap"            # 存储GDP数值的列名
  ) %>%
  mutate(year = as.integer(year))      # 把year转成数值型(可选,按需处理)

执行后,你的数据会变成每行对应一个国家、一个年份的GDP数据,包含continent、country、indicator、year、gdpPercap这几列。

方法二:用base R的reshape函数

如果不想加载额外包,可以用base R自带的reshape函数,语法稍繁琐但无需依赖外部库:

# 转换格式
df_long_base <- reshape(
  df,
  direction = "long",
  varying = grep("gdpPercap_", names(df)),  # 指定要转换的目标列
  v.names = "gdpPercap",                   # 数值列的名称
  timevar = "year",                        # 年份字段的名称
  times = sub("gdpPercap_", "", names(df)[grep("gdpPercap_", names(df))]), # 提取年份
  idvar = c("continent", "country"),       # 保持不变的分组列
  new.row.names = 1:(nrow(df)*length(grep("gdpPercap_", names(df))))
)

# 可选:将year转为数值型
df_long_base$year <- as.integer(df_long_base$year)

哪种方法更合适?

如果平时常用tidyverse工具链,优先选pivot_longer——它的参数设计更贴合人的思维,遇到更复杂的列名拆分(比如多分隔符、不规则命名)时,还可以用names_pattern配合正则表达式处理,灵活性拉满。

如果追求轻量、不想加载包,base R的reshape也能完成任务,但代码可读性和扩展性不如前者。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 10:06:22