如何在R中将含年份的宽格式数据框重塑为长格式?
解决宽格式转长格式的问题
你可以通过tidyr::pivot_longer的多列匹配分组功能实现需求,核心是利用names_to和names_pattern参数提取变量名与年份,具体步骤如下:
1. 构造示例数据
先还原你的原始数据框:
library(tidyr) library(dplyr) # 原始宽格式数据 df_wide <- tibble( site = c(1, 2), `Mean VV 2019` = c(-2, -11), `Mean Lst 2019` = c(-4, -19), `Mean Vv 2020` = c(-6.7, -20), `Mean Lst 2020` = c(-10, -8), `Mean VV 2021` = c(-1.67, -13), `Mean Lst 2021` = c(-24, -5) )
2. 转换为长格式
使用pivot_longer,通过正则表达式匹配列名中的变量类型和年份:
df_long <- df_wide %>% # 统一列名大小写(解决原数据中VV、Lst大小写不一致的问题) rename_with(~ gsub("Vv", "VV", .x)) %>% rename_with(~ gsub("Lst", "LST", .x)) %>% # 执行宽转长 pivot_longer( cols = -site, # 排除site列,转换其余所有列 names_to = c(".value", "Year"), # .value保留变量名,Year存储提取的年份 names_pattern = "(.*) (\\d{4})" # 正则匹配:(变量名部分) (四位年份) ) %>% # 可选:将Year转为数值型 mutate(Year = as.integer(Year))
3. 输出结果
运行后得到的df_long即为目标长格式:
# A tibble: 6 × 4 site `Mean VV` `Mean LST` Year <dbl> <dbl> <dbl> <int> 1 1 -2 -4 2019 2 1 -6.7 -10 2020 3 1 -1.67 -24 2021 4 2 -11 -19 2019 5 2 -20 -8 2020 6 2 -13 -5 2021
关键参数说明
names_to = c(".value", "Year"):.value是特殊占位符,用于保留列名中代表变量类型的部分(如Mean VV),Year用来存储提取出的年份值。names_pattern = "(.*) (\\d{4})":正则表达式,(.*)匹配变量名部分,(\\d{4})匹配四位数字的年份,两者以空格分隔,完全对应原列名的结构。
内容的提问来源于stack exchange,提问作者gis.rajan
相关产品推荐
相关产品推荐

