用库存 returns 拆分庞大的数据集

Unstacking huge dataset with stock returns

我有一个很长的 CRSP data.frame,我正在尝试将它拆成宽格式。

数据框包含 kypermno(股票标识符)、caldat(日期 yyyy-mm-dd)、prc(价格)、adjprc(调整后价格)和 ret(return)。数据框按股票 (kypermno) 和日期 (caldat) 排序,因此每一行代表给定日期的一只股票。

我想要的格式是:每个 kypermno 作为列(名称),每天(日期)作为行(名称)和相应字段中的 returns(删除 prc 和 adjprc)。

我试过这个:D_ret <- as.data.frame(unstack(hilfs_ret, ret ~ kypermno))

问题是并非所有股票全天都有 return,所以我收到一条错误消息:

”错误(函数(...,row.names = NULL,check.rows = FALSE,check.names = TRUE,: Argumente implizieren unterschiedliche Anzahl Zeilen" (英文:参数表示行数不同)

如果股票没有 return 或在那个日期甚至不存在,则应该有 "NA" 填充。

当我跳过 "as.data.frame" 函数时不会出现此错误消息,但我想要一个 data.frame 而不是列表。

使用 for 循环和 if 语句的解决方案不可行,因为数据集非常大(4800 万个条目)。

有办法解决吗?也许有重塑功能?

非常感谢您的帮助,祝您有愉快的一天!

亲切的问候

kb

您可以使用 tidyverse 包集合中的函数。假设您的数据框称为 "long_df." 那么此代码应将其转换为名为 "wide_df."

的数据框
library(tidyverse)
wide_df <- tidyr::spread(long_df %>% select(-prc, -adjprc), 
                         key= kypermno,
                         value = ret)