在 Rblapi手册中声明Rblapi::bdh
返回
包含与证券条目一样多的条目的列表;每个列表都包含一个 data.frame,每个观察值一行,列数与字段中的条目一样多。如果列表长度为 1,则将其折叠为单个数据框。请注意,返回证券的顺序由后端决定,可能与证券领域的证券顺序不同。
所以我建议你rbind
数据然后重塑它以获得你想要的结果。一种快速的方法是使用data.table::rbindlist
函数,它将一个列表作为输入并返回一个data.table
包含所有条目的函数,如果idcol=TRUE
这样,它将附加一个.id
列,显示 data.frame 的来源。即使调用data.frame
产生的 s中的行数不同,此方法也将起作用Rblapi::bdh
。
# Declaring field to be dowloaded
flds<-"PX_LAST"
# LOADING THE DATA FROM THE API
l <- bdh(sec,flds,start.date=as.Date("2019-08-18"),end.date=as.Date("2020-08-18"), include.non.trading.days=TRUE)
# the names of the securities columns as returned by the api
securities <- paste0("eusa", c(2,5,10,15,30), ".curncy.",flds)
# row binding the resulting list
dt <- data.table::rbindlist(l, idcol=T, use.names=FALSE)
# idcol=T appends an id column (.id) to the resulting data.table
# use.names=F because the columns of the data.frames are different
# remaking the .id column so it reflects the name of the column that it already had
dt[, .id:= securities[.id] ]
# making a wider data.table
data.table::dcast(dt, eusa2.curncy.date ~ .id, value.var=securities[1])
# eusa2.curncy.date is the column that defines a group of observation
# .id the name of the columns
# securities[1] or eusa2.curncy.PX_LAST is the column that contains the values
使用的数据
由于我无法访问bloomberg api端点,因此我创建了这个类似于输出的模拟数据dbh
col.names <- paste0("eusa", rep(c(2,5,10,15,30),each=2), ".curncy.", rep(c(flds,"date"), 5))
l<-rep(list(data.frame(rnorm(200), 1:200)), 5)
for (i in 1:length(l)) colnames(l[[i]]) <- col.names[(2*i-1):(2*i)]