如何在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 )
代码说明
- 正则匹配列名:
正则(Ref_date|Yield|Maturity)(\\d+)会把Ref_date3这类列名拆成两部分:第一组是列的类型(日期/收益率/期限),第二组是期限的编号后缀。 .value的关键作用:
指定.value作为names_to的第一个元素,意味着把匹配到的前缀(比如Ref_date)作为新列名,所有同前缀的列会自动合并为一列。- NA值处理:
drop_na()直接过滤掉任何包含NA的行,确保结果无缺失值。 - 列名标准化:
通过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
相关产品推荐
相关产品推荐

