我已经通过WRDS网站从CRSP数据库下载了历史美国股票价格。
我可以导入.csv文件,但我的方法是将它正确地放入xts-object中至少是不方便的。在较长的时间段和更多的数据之后,根据每个ID分割原始数据帧后,数据帧列表最多可达数十千兆字节。因此,我正在寻找一种更有效的方法来将数据帧(包括一个简单的列表)转换为准备使用的xts-object。
导入后数据框的结构:(股票一个在另一个下面列出)
> head(dataf)
ï..Names.Date PERMNO Price.adjusted
1 31/01/2014 10104 36.90
2 28/02/2014 10104 39.11
3 31/03/2014 10104 40.91
xts-object中的所需格式:
> dat[1:3,1:19]
X10104 X10107 X11308 X11587 X11628 X11850 X12060 X12072 X12400
Jan 2014 36.90 37.84 37.82 267.18 18.35 92.16 25.13 17.74 53.53
Feb 2014 39.11 38.31 38.20 289.43 19.73 96.27 25.47 18.43 53.68
Mar 2014 40.91 40.99 38.66 306.14 20.20 97.68 25.89 18.25 52.54
我的方法:
#read CSV into a data frame
dataf <- read.csv(file = "us-data14-16.csv", header = TRUE, sep = ";", fill = TRUE)
#data preprocessing, deletes objects with price = 0
dataf <- dataf[dataf[, 3] != 0, ]
#split list according to ticker in a list of data frames
dataf <- split(dataf, f= dataf[,2])
#get identifier
id <- names(dataf)
#convert data frames into xts objects
datax <- lapply(dataf, function(x) xts(x$Price.adjusted, as.yearmon(x[,1], "%d/%m/%Y")))
#set column name according to ticker (loop through every element in the list)
sapply(seq_along(datax), function(x) colnames(datax[[x]]) <<- id[x])
#merge list of xts objects in one xts object
dat <- do.call(merge, datax)
答案 0 :(得分:1)
您需要使用方向为宽的重塑功能。
df = data.frame(Names.Date= rep(seq(1:10), 10), PERMNO=sort(rep(seq(from= 101, to=110), 10)), Price.adjusted=rnorm(100))
reshape(df, idvar = "Names.Date", timevar = "PERMNO", direction = "wide")
答案 1 :(得分:1)
您可能会发现理解read.zoo
及其split
参数更容易。 reshape
函数很难记住如何使用。
首先,从一个动物园小插曲中获取一些示例数据。
dataf <- structure(list(V1 = c("13/10/2010", "13/10/2010", "13/10/2010",
"14/10/2010", "14/10/2010", "14/10/2010", "15/10/2010", "15/10/2010",
"15/10/2010"), V2 = c("A", "B", "C", "A", "B", "C", "A", "B", "C"),
V3 = c(23L, 12L, 124L, 43L, 54L, 65L, 43L, NA, 65L)),
.Names = c("V1", "V2", "V3"), class = "data.frame", row.names = c(NA, -9L))
然后使用read.zoo
将data.frame转换为zoo对象。
z <- read.zoo(dataf, format = "%d/%m/%Y", split = 2)
z
# A B C
# 2010-10-13 23 12 124
# 2010-10-14 43 54 65
# 2010-10-15 43 NA 65
如果您想将as.xts(z)
转换为xts对象,可以致电z
。