2017-07-27 99 views
1

注意:我自己找到了一个解决方案,并将其置于本文后面的答案中。因为我花了一段时间才弄清楚这个问题,这对于其他人来说也是如此,它似乎是会计和金融研究中的常见任务。将CRSP每日股票收益转换为R中的Zoo对象

假设我目前有一个数据框,其中包含日期的一堆不同公司的日常股票收益,数据的结构使得一列包含公司标识符(ticker),第二列包含日期,第三列包含回报。 (这是从CRSP获得的格式。)如何将这些数据转换为zoo对象R

可重复的代码来获得需要被转换为zoo对象的数据帧:

Z.date <- c(as.Date(12501:12505), as.Date(12501:12506), as.Date(12501:12505)) 
Z.firm <- c(rep("A", 5), rep("B", 6), rep("C", 5)) 
set.seed(50) 
Z.returns <- c(rnorm(5), rnorm(6), rnorm(5)) 
df <- data.frame(Z.date, Z.firm, Z.returns) 

其中产量:

 Z.date Z.firm Z.returns 
1 2004-03-24  A 0.54966989 
2 2004-03-25  A -0.84160374 
3 2004-03-26  A 0.03299794 
4 2004-03-27  A 0.52414971 
5 2004-03-28  A -1.72760411 
6 2004-03-24  B -0.27786453 
7 2004-03-25  B 0.36082844 
8 2004-03-26  B -0.59091244 
9 2004-03-27  B 0.97559055 
10 2004-03-28  B -1.44574995 
11 2004-03-29  B 0.29520677 
12 2004-03-24  C 0.55475223 
13 2004-03-25  C -0.49863554 
14 2004-03-26  C 0.19573384 
15 2004-03-27  C -0.45554055 
16 2004-03-28  C -0.36285547 

所需zoo对象应该是这个样子:

   A   B   C 
2004-03-24  0.54966989 -0.27786453 0.55475223 
2004-03-25 -0.84160374 0.36082844 -0.49863554 
2004-03-26  0.03299794 -0.59091244 0.19573384 
2004-03-27  0.52414971 0.97559055 -0.45554055 
2004-03-28 -1.72760411 -1.44574995 -0.36285547 
2004-03-29  NA   0.29520677 NA 

回答

2

使用read.zoosplit说法:

read.zoo(df, split = "Z.firm") 

给这个"zoo"对象:

     A   B   C 
2004-03-24 0.54966989 -0.2778645 0.5547522 
2004-03-25 -0.84160374 0.3608284 -0.4986355 
2004-03-26 0.03299794 -0.5909124 0.1957338 
2004-03-27 0.52414971 0.9755906 -0.4555405 
2004-03-28 -1.72760411 -1.4457499 -0.3628555 
2004-03-29   NA 0.2952068   NA 
0

简单的解决方案。使用tidyr包翻转数据帧,然后将其转换为zoo对象。

library(zoo) 
library(tidyr) 

wide_df <- tidyr::spread(df, key = Z.firm, value = Z.returns) # flip using tidyr's spread() 
df.zoo <- zoo(wide_df, order.by = wide_df$Z.date) # convert to zoo, ordering by date 
df.zoo <- df.zoo[, colnames(df.zoo) != "Z.date"] # get rid of the superfluous date column 

这产生了:

  A   B   C   
2004-03-24 0.54966989 -0.2778645 0.5547522 
2004-03-25 -0.84160374 0.3608284 -0.4986355 
2004-03-26 0.03299794 -0.5909124 0.1957338 
2004-03-27 0.52414971 0.9755906 -0.4555405 
2004-03-28 -1.72760411 -1.4457499 -0.3628555 
2004-03-29 <NA>   0.2952068 <NA>