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

如何在R中使用pivot_longer将宽格式每日债券数据集转长格式?

宽格式债券数据转长格式解决方案

核心代码实现

假设你的宽格式数据框名为bond_data,使用tidyr的pivot_longer可精准完成格式转换并剔除NA值:

library(tidyr)
library(dplyr)

long_format_data <- bond_data %>%
  pivot_longer(
    cols = everything(),
    # 将列名拆分为「值类型」和「期限分组」两部分
    names_to = c(".value", "term_suffix"),
    # 正则匹配列名前缀(Ref_date/Yield/Maturity)和后缀编号
    names_pattern = "(Ref_date|Yield|Maturity)(\\d+)"
  ) %>%
  # 剔除所有含NA的行
  drop_na() %>%
  # 重命名列到目标格式
  select(
    reference_date = Ref_date,
    yield = Yield,
    maturity = Maturity
  )

代码说明

  1. 正则匹配列名:
    正则(Ref_date|Yield|Maturity)(\\d+)会把Ref_date3这类列名拆成两部分:第一组是列的类型(日期/收益率/期限),第二组是期限的编号后缀。
  2. .value的关键作用:
    指定.value作为names_to的第一个元素,意味着把匹配到的前缀(比如Ref_date)作为新列名,所有同前缀的列会自动合并为一列。
  3. NA值处理:
    drop_na()直接过滤掉任何包含NA的行,确保结果无缺失值。
  4. 列名标准化:
    通过select()把合并后的列名改为你需要的reference_date、yield、maturity。

示例验证

假设你的宽格式数据如下:

bond_data <- tibble(
  Ref_date1 = c("2023-01-01", "2023-01-02", NA),
  Yield1 = c(2.1, 2.2, NA),
  Maturity1 = c(1, 1, NA),
  Ref_date2 = c("2023-01-01", NA, "2023-01-03"),
  Yield2 = c(2.5, NA, 2.6),
  Maturity2 = c(5, NA, 5)
)

运行代码后会得到符合预期的长格式结果:

# A tibble: 4 × 3
  reference_date yield maturity
  <chr>          <dbl>    <dbl>
1 2023-01-01       2.1        1
2 2023-01-02       2.2        1
3 2023-01-01       2.5        5
4 2023-01-03       2.6        5

常见错误排查

如果之前用pivot_longer失败,大概率是这两个问题:

  • 未使用.value映射列组,导致所有列被堆到一列,无法区分日期、收益率和期限
  • 正则表达式匹配错误,需根据实际列名调整规则(比如列名是Ref_date_1Y,正则要改为(Ref_date|Yield|Maturity)_(.*))

内容的提问来源于stack exchange,提问作者Rodrigo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 12:30:09