我有一个嵌套列表,我想使用 R 将其转换为数据框,类似于此问题flatten a dataframe
这是我的列表的结构
> str(rf_curves$GBP)
List of 27
$ NA :'data.frame': 0 obs. of 2 variables:
..$ date :Class 'Date' int(0)
..$ px_last: num(0)
$ BP0012M Index :'data.frame': 5 obs. of 2 variables:
..$ date : Date[1:5], format: "2018-05-21" "2018-05-22" ...
..$ px_last: num [1:5] 0.929 0.931 0.918 0.918 0.901
$ BP0003M Index :'data.frame': 5 obs. of 2 variables:
..$ date : Date[1:5], format: "2018-05-21" "2018-05-22" ...
..$ px_last: num [1:5] 0.623 0.623 0.619 0.614 0.611
$ BP0006M Index :'data.frame': 5 obs. of 2 variables:
..$ date : Date[1:5], format: "2018-05-21" "2018-05-22" ...
..$ px_last: num [1:5] 0.746 0.743 0.734 0.733 0.723
$ NA :'data.frame': 0 obs. of 2 variables:
..$ date :Class 'Date' int(0)
..$ px_last: num(0)
Run Code Online (Sandbox Code Playgroud)
我想要一个数据框
px_last.所以数据框的样本是:
date NA BP0012M BP0003M BOP0006M
2018-05-21 0.929 0.623 0.746
2018-05-22 0.931 0.623 0.743
2018-05-23 0.918 0.619 0.743
2018-05-24 0.918 0.614 0.733
2018-05-25 0.901 0.611 0.723
Run Code Online (Sandbox Code Playgroud)
最终目标是有一种方便的方法来获得给定特定开始日期的无风险曲线。例如,BP0012M 是 12 个月英镑 libor。我目前使用库(Rblpapi)从 Bloomberg 加载数据。如果我可以从另一个提供商(例如 Quandl)获得相同的数据,那就可以了。如果我可以实现这个目标,而无需将列表展平为数据框,那么我也可以接受该解决方案。
编辑:请求的输出粘贴在下面
> dput(rf_curves$GBP)
structure(list(`NA` = structure(list(date = structure(integer(0), class = "Date"),
px_last = numeric(0)), class = "data.frame", .Names = c("date",
"px_last"), row.names = integer(0)), `BP0012M Index` = structure(list(
date = structure(17672:17676, class = "Date"), px_last = c(0.92894,
0.93081, 0.91831, 0.9182, 0.90056)), class = "data.frame", .Names = c("date",
"px_last"), row.names = c(NA, 5L)), `BP0003M Index` = structure(list(
date = structure(17672:17676, class = "Date"), px_last = c(0.62281,
0.6225, 0.619, 0.61406, 0.61067)), class = "data.frame", .Names = c("date",
"px_last"), row.names = c(NA, 5L)), `BP0006M Index` = structure(list(
date = structure(17672:17676, class = "Date"), px_last = c(0.7463,
0.74323, 0.73411, 0.73321, 0.72312)), class = "data.frame", .Names = c("date",
"px_last"), row.names = c(NA, 5L)), `NA` = structure(list(date = structure(integer(0), class = "Date"),
px_last = numeric(0)), class = "data.frame", .Names = c("date",
"px_last"), row.names = integer(0)), `NA` = structure(list(date = structure(integer(0), class = "Date"),
px_last = numeric(0)), class = "data.frame", .Names = c("date",
"px_last"), row.names = integer(0)), `NA` = structure(list(date = structure(integer(0), class = "Date"),
px_last = numeric(0)), class = "data.frame", .Names = c("date",
"px_last"), row.names = integer(0)), `NA` = structure(list(date = structure(integer(0), class = "Date"),
px_last = numeric(0)), class = "data.frame", .Names = c("date",
"px_last"), row.names = integer(0)), `NA` = structure(list(date = structure(integer(0), class = "Date"),
px_last = numeric(0)), class = "data.frame", .Names = c("date",
"px_last"), row.names = integer(0)), `BPSW30 CMPN Curncy` = structure(list(
date = structure(c(17672L, 17673L, 17674L, 17675L, 17676L,
17680L, 17681L), class = "Date"), px_last = c(1.758, 1.768,
1.715, 1.696, 1.628, 1.531, 1.56725)), class = "data.frame", .Names = c("date",
"px_last"), row.names = c(NA, 7L)), `NA` = structure(list(date = structure(integer(0), class = "Date"),
px_last = numeric(0)), class = "data.frame", .Names = c("date",
"px_last"), row.names = integer(0)), `NA` = structure(list(date = structure(integer(0), class = "Date"),
px_last = numeric(0)), class = "data.frame", .Names = c("date",
"px_last"), row.names = integer(0)), `BPSW8 CMPN Curncy` = structure(list(
date = structure(c(17672L, 17673L, 17674L, 17675L, 17676L,
17680L, 17681L), class = "Date"), px_last = c(1.5675, 1.5955,
1.5375, 1.5175, 1.4475, 1.342, 1.37775)), class = "data.frame", .Names = c("date",
"px_last"), row.names = c(NA, 7L)), `BPSW1F CMPN Curncy` = structure(list(
date = structure(c(17672L, 17673L, 17674L, 17675L, 17676L,
17680L, 17681L), class = "Date"), px_last = c(0.942, 0.9575,
0.9225, 0.9188, 0.8864, 0.84505, 0.863)), class = "data.frame", .Names = c("date",
"px_last"), row.names = c(NA, 7L)), `BPSW9 CMPN Curncy` = structure(list(
date = structure(c(17672L, 17673L, 17674L, 17675L, 17676L,
17680L, 17681L), class = "Date"), px_last = c(1.6115, 1.6395,
1.5795, 1.5585, 1.4885, 1.381, 1.419)), class = "data.frame", .Names = c("date",
"px_last"), row.names = c(NA, 7L)), `BPSW2 CMPN Curncy` = structure(list(
date = structure(c(17672L, 17673L, 17674L, 17675L, 17676L,
17679L, 17680L, 17681L), class = "Date"), px_last = c(1.0335,
1.0508, 1.0094, 0.9988, 0.9674, 0.9674, 0.9027, 0.92975)), class = "data.frame", .Names = c("date",
"px_last"), row.names = c(NA, 8L)), `BPSW10 CMPN Curncy` = structure(list(
date = structure(c(17672L, 17673L, 17674L, 17675L, 17676L,
17679L, 17680L, 17681L), class = "Date"), px_last = c(1.651,
1.675, 1.616, 1.593, 1.52, 1.52, 1.427, 1.455)), class = "data.frame", .Names = c("date",
"px_last"), row.names = c(NA, 8L)), `NA` = structure(list(date = structure(integer(0), class = "Date"),
px_last = numeric(0)), class = "data.frame", .Names = c("date",
"px_last"), row.names = integer(0)), `BPSW3 CMPN Curncy` = structure(list(
date = structure(c(17672L, 17673L, 17674L, 17675L, 17676L,
17680L, 17681L), class = "Date"), px_last = c(1.1795, 1.2025,
1.1525, 1.1445, 1.0965, 1.01, 1.0435)), class = "data.frame", .Names = c("date",
"px_last"), row.names = c(NA, 7L)), `BPSW12 CMPN Curncy` = structure(list(
date = structure(c(17672L, 17673L, 17674L, 17675L, 17676L,
17680L, 17681L), class = "Date"), px_last = c(1.7105, 1.7325,
1.6735, 1.6495, 1.5795, 1.474, 1.5115)), class = "data.frame", .Names = c("date",
"px_last"), row.names = c(NA, 7L)), `BPSW4 CMPN Curncy` = structure(list(
date = structure(c(17672L, 17673L, 17674L, 17675L, 17676L,
17680L, 17681L), class = "Date"), px_last = c(1.294, 1.33,
1.27, 1.258, 1.202, 1.107, 1.1371)), class = "data.frame", .Names = c("date",
"px_last"), row.names = c(NA, 7L)), `BPSW15 CMPN Curncy` = structure(list(
date = structure(c(17672L, 17673L, 17674L, 17675L, 17676L,
17680L, 17681L), class = "Date"), px_last = c(1.7615, 1.7805,
1.7225, 1.6985, 1.6295, 1.525, 1.5615)), class = "data.frame", .Names = c("date",
"px_last"), row.names = c(NA, 7L)), `BPSW5 CMPN Curncy` = structure(list(
date = structure(c(17672L, 17673L, 17674L, 17675L, 17676L,
17680L, 17681L), class = "Date"), px_last = c(1.3855, 1.4155,
1.3595, 1.3465, 1.2875, 1.185, 1.21425)), class = "data.frame", .Names = c("date",
"px_last"), row.names = c(NA, 7L)), `BPSW20 CMPN Curncy` = structure(list(
date = structure(c(17672L, 17673L, 17674L, 17675L, 17676L,
17680L, 17681L), class = "Date"), px_last = c(1.7895, 1.8045,
1.7485, 1.7255, 1.6565, 1.554, 1.5895)), class = "data.frame", .Names = c("date",
"px_last"), row.names = c(NA, 7L)), `BPSW6 CMPN Curncy` = structure(list(
date = structure(c(17672L, 17673L, 17674L, 17675L, 17676L,
17680L, 17681L), class = "Date"), px_last = c(1.4565, 1.4855,
1.4285, 1.4135, 1.35725, 1.2555, 1.278)), class = "data.frame", .Names = c("date",
"px_last"), row.names = c(NA, 7L)), `BPSW25 CMPN Curncy` = structure(list(
date = structure(c(17672L, 17673L, 17674L, 17675L, 17676L,
17680L, 17681L), class = "Date"), px_last = c(1.778, 1.791,
1.737, 1.716, 1.647, 1.548, 1.5835)), class = "data.frame", .Names = c("date",
"px_last"), row.names = c(NA, 7L)), `BPSW7 CMPN Curncy` = structure(list(
date = structure(c(17672L, 17673L, 17674L, 17675L, 17676L,
17680L, 17681L), class = "Date"), px_last = c(1.5155, 1.5445,
1.4875, 1.4695, 1.4025, 1.298, 1.331)), class = "data.frame", .Names = c("date",
"px_last"), row.names = c(NA, 7L))), .Names = c("NA", "BP0012M Index",
"BP0003M Index", "BP0006M Index", "NA", "NA", "NA",
"NA", "NA", "BPSW30 CMPN Curncy", "NA", "NA", "BPSW8 CMPN Curncy",
"BPSW1F CMPN Curncy", "BPSW9 CMPN Curncy", "BPSW2 CMPN Curncy",
"BPSW10 CMPN Curncy", "NA", "BPSW3 CMPN Curncy", "BPSW12 CMPN Curncy",
"BPSW4 CMPN Curncy", "BPSW15 CMPN Curncy", "BPSW5 CMPN Curncy",
"BPSW20 CMPN Curncy", "BPSW6 CMPN Curncy", "BPSW25 CMPN Curncy",
"BPSW7 CMPN Curncy"))
Run Code Online (Sandbox Code Playgroud)
一种方法是对数据集进行行绑定,然后使用tidyr::spread. 假设您的数据框列表是dat,那么
library(dplyr)
library(tidyr)
out <- bind_rows(dat, .id = "ticker") %>%
mutate(ticker = gsub("^([A-Z0-9]+).*$", "\\1", ticker)) %>%
spread(key = ticker, value = px_last)
Run Code Online (Sandbox Code Playgroud)
其中gsub清理ticker仅包括股票本身。输出看起来像
out[, 1:6]
# date BP0003M BP0006M BP0012M BPSW10 BPSW12
# 1 2018-05-21 0.62281 0.74630 0.92894 1.651 1.7105
# 2 2018-05-22 0.62250 0.74323 0.93081 1.675 1.7325
# 3 2018-05-23 0.61900 0.73411 0.91831 1.616 1.6735
# 4 2018-05-24 0.61406 0.73321 0.91820 1.593 1.6495
# 5 2018-05-25 0.61067 0.72312 0.90056 1.520 1.5795
# 6 2018-05-28 NA NA NA 1.520 NA
# 7 2018-05-29 NA NA NA 1.427 1.4740
# 8 2018-05-30 NA NA NA 1.455 1.5115
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
389 次 |
| 最近记录: |