如何基于列名中的年份数值创建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
相关产品推荐
相关产品推荐

