使用库存退货卸载大型数据集

时间:2017-04-07 15:17:34

标签: r stack reshape

我有一个很长的CRSP data.frame,我正试图将它拆分为宽格式。

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

enter image description here

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

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

问题是并非所有股票都在所有日子都有回报,因此我收到一条错误消息:

“错误(函数(...,row.names = NULL,check.rows = FALSE,check.names = TRUE,:   Argumente implizieren unterschiedliche Anzahl Zeilen“ (英文:参数意味着行数不同)

如果股票没有回报或者在该日期甚至不存在,则应该填写“NA”。

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

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

无论如何要解决这个问题?也许有重塑功能?

非常感谢你的帮助,祝你有个美好的一天!

亲切的问候

kb的

1 个答案:

答案 0 :(得分:0)

您可以使用tidyverse包集合中的函数。假设您的数据框称为“long_df”。然后,此代码应将其转换为名为“wide_df。”的数据框。

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