如何将嵌套列表转换为R DataFrame以构建无风险收益率曲线
解决方案:将嵌套列表转换为宽格式无风险收益率曲线DataFrame
针对你从Bloomberg加载的嵌套列表数据,我们可以通过数据清理、合并、重塑三个步骤得到你需要的宽格式DataFrame。以下是具体实现:
步骤1:清理空数据
首先过滤掉列表中那些空的data.frame(就是命名为NA且行数为0的元素),这些数据没有实际价值:
# 过滤空data.frame,只保留有数据的条目 filtered_rf <- Filter(function(x) nrow(x) > 0, rf_curves$GBP)
步骤2:为每个数据集添加ticker标识
给每个非空的data.frame添加ticker列,值为对应的列表名称(同时清理掉Bloomberg的后缀如Index或CMPN Curncy):
# 为每个df添加ticker列并清理名称 named_dfs <- Map(function(df, ticker_name) { # 去掉ticker名称中的冗余后缀 clean_ticker <- gsub(" Index| CMPN Curncy", "", ticker_name) df$ticker <- clean_ticker df }, filtered_rf, names(filtered_rf))
步骤3:合并并重塑为宽格式
先将所有data.frame合并成一个长格式数据集,再转换为你需要的宽格式(行=date,列=ticker,值=px_last):
# 加载tidyverse工具包(如果没安装先运行install.packages("tidyverse")) library(tidyverse) # 合并成长格式df long_format <- bind_rows(named_dfs) # 转换为宽格式 wide_rf_curve <- long_format %>% pivot_wider( id_cols = date, # 行标识符:日期 names_from = ticker, # 列标识符:ticker values_from = px_last # 填充值:收益率 )
最终结果示例
运行后你会得到类似这样的DataFrame(自动用NA填充不同ticker间的日期缺失值):
date BP0012M BP0003M BP0006M BPSW30 BPSW8 BPSW1F BPSW9 1 2018-05-21 0.92894 0.62281 0.74630 1.758 1.5675 0.942 1.6115 2 2018-05-22 0.93081 0.62250 0.74323 1.768 1.5955 0.9575 1.6395 3 2018-05-23 0.91831 0.61900 0.73411 1.715 1.5375 0.9225 1.5795 4 2018-05-24 0.91820 0.61406 0.73321 1.696 1.5175 0.9188 1.5585 5 2018-05-25 0.90056 0.61067 0.72312 1.628 1.4475 0.8864 1.4885 6 2018-05-29 NA NA NA 1.531 1.342 0.84505 1.381 7 2018-05-30 NA NA NA 1.56725 1.37775 0.863 1.419
额外提示
如果你用Rblpapi加载数据时想直接获取宽格式,可以在bdh()函数中调整参数,比如:
# 直接请求宽格式数据(示例) library(Rblpapi) conn <- blpConnect() tickers <- c("BP0012M Index", "BP0003M Index", "BP0006M Index") fields <- "PX_LAST" start_date <- as.Date("2018-05-21") # 直接得到宽格式结果 wide_data <- bdh(conn, tickers, fields, start.date = start_date) blpDisconnect(conn)
内容的提问来源于stack exchange,提问作者jacob
相关产品推荐
相关产品推荐

