如何用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
相关产品推荐
相关产品推荐

