我有一个很长的CRSP data.frame,我正试图将它拆分为宽格式。
数据框包含kypermno(股票标识符),caldat(日期yyyy-mm-dd),prc(价格),adjprc(调整后价格)和ret(返回)。数据框按库存(kypermno)和按日期(caldat)排序,因此每行代表给定日期的一个库存。
我想要的格式是:每个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的
答案 0 :(得分:0)
您可以使用tidyverse
包集合中的函数。假设您的数据框称为“long_df”。然后,此代码应将其转换为名为“wide_df。”的数据框。
library(tidyverse)
wide_df <- tidyr::spread(long_df %>% select(-prc, -adjprc),
key= kypermno,
value = ret)