用库存 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)
我有一个很长的 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)