如何将PCRA导出的data.table转换为xts式宽表格式?
问题
使用PCRA包获取数据时,导出为xts对象是日期+各股票收益率列的宽表格式:
class(stocksDat) [1] "xts" "zoo" > head(stocksDat[, 1:3]) AAN ABM ABT 1993-01-31 0.28947368 -0.11250000 -0.08971193 1993-02-28 -0.04081633 0.14893617 -0.05000000 1993-03-31 -0.08510638 0.01234568 -0.01435407 1993-04-30 -0.04651163 0.03658536 0.08912621 1993-05-31 0.08829268 -0.08875740 -0.02690583 1993-06-30 -0.01123596 -0.10389610 -0.05529954
但导出为data.table时,得到的是TickerLast、Date、Return三列的长表:
> class(stocksDat2) [1] "data.table" "data.frame" > stocksDat2 TickerLast Date Return 1: AAN 1993-01-31 0.28947368 2: ABM 1993-01-31 -0.11250000 3: ABT 1993-01-31 -0.08971193 4: ADBE 1993-01-31 0.31999999 5: ADI 1993-01-31 0.01538462 --- 81140: WGO 2015-12-31 -0.11555557 81141: WHR 2015-12-31 -0.09629589 81142: WMT 2015-12-31 0.05013595 81143: WTS 2015-12-31 -0.10520627 81144: XOM 2015-12-31 -0.04543236
需要将data.table转换为xts那样的宽表格式,转成data.frame也无法解决,询问操作方法及PCRA输出是否存在错误。
最小示例代码:
library(PCRA) library(xts) stockItems <- c("Date","TickerLast","Return") # No need to specify begin and end dates if you want all # Get the data as an xts object (the default) stocksDat <- selectCRSPandSPGMI("monthly", stockItems = stockItems, factorItems = NULL, subsetType = NULL, subsetValues = NULL, outputType = "xts") names(stocksDat) dim(stocksDat) head(stocksDat[,1:3]) range(index(stocksDat)) # To see begin and end dates # Now for a data.table output stocksDat2 <- selectCRSPandSPGMI("monthly", stockItems = stockItems, factorItems = NULL, subsetType = NULL, subsetValues = NULL, outputType = "data.table") names(stocksDat2) class(stocksDat2) dim(stocksDat2) head(stocksDat2)
解决方案
PCRA的输出格式没有错误,这是xts和data.table两种数据结构的设计差异:xts是面向时间序列的宽表结构,而data.table输出的是长表(tidy data)格式,两者都是合理的数据组织方式。
要将长表格式的data.table转换为xts样式的宽表,直接使用data.table内置的dcast函数即可:
# 将长表转为宽表:Date作为行索引列,TickerLast作为列名,Return作为填充值 stocksDat_wide <- dcast(stocksDat2, Date ~ TickerLast, value.var = "Return") # 查看转换后的宽表头部 head(stocksDat_wide[, 1:4])
转换后的结果会和xts的结构一致:Date列作为第一列,后续每一列对应一个股票的月度收益率。
如果需要进一步转为xts对象(可选),可以执行:
library(xts) # 将Date列转为时间索引,剩余列作为时间序列数据 stocksDat_xts <- xts(stocksDat_wide[, -1], order.by = as.Date(stocksDat_wide$Date))
内容的提问来源于stack exchange,提问作者Thomas Philips
相关产品推荐
相关产品推荐

