You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:05:03