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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 00:32:21