如何基于列名末尾的4位年份对多列执行pivot_longer操作?
列名含后缀年份的宽表转长表(pivot_longer实现)
针对你这种列名以.4位年份结尾的宽表,用tidyr::pivot_longer配合正则表达式就能高效完成转置,核心是拆分列名为变量名和年份两个字段:
步骤1:加载必要包
需要用到tidyverse(包含tidyr和dplyr):
library(tidyverse)
步骤2:执行转置操作
直接用pivot_longer的names_pattern参数通过正则拆分列名:
df_long <- df %>% pivot_longer( cols = -id, # 保留id列,其余列都转为长格式 names_pattern = "(.*)\\.(\\d{4})", # 正则匹配规则 names_to = c("variable", "year"), # 拆分后生成的两个列名 values_to = "value" # 对应值的列名 )
正则表达式解释
(.*):贪婪匹配列名中最后一个点之前的所有内容,不管列名本身是否包含其他点(适配不规则列名)\\.:匹配分隔变量名和年份的点(正则中点是特殊字符,需用反斜杠转义)(\\d{4}):匹配末尾的4位数字年份
转置结果示例
运行后得到的长表结构如下:
> head(df_long) # A tibble: 6 × 4 id variable year value <chr> <chr> <chr> <chr> 1 a column1 2015 1 2 a column1 2016 4 3 a column1 2017 4 4 a column1 2018 4 5 a column1 2019 4 6 a column2 2015 1
可选优化:转换值类型
如果你的值原本是数值型(示例中是字符),可以追加一步转类型:
df_long <- df_long %>% mutate(value = as.numeric(value))
内容的提问来源于stack exchange,提问作者Abdullah Gok
相关产品推荐
相关产品推荐

