【发布时间】:2014-06-23 08:23:31
【问题描述】:
我需要从数据框创建股票数据。数据框包含开始日期和结束日期,表示项目的库存期间。我想汇总每个项目的库存水平,然后使用数据创建一个时间序列。
我有以下形式的数据:
A <- c("a","b","a","b","c")
begindate <- as.Date(c("2014-01-01", "2014-01-03", "2014-01-03", "2014-01-02", "2014-01-02"))
enddate <- as.Date(c("2014-01-04", "2014-01-05", "2014-01-06", "2014-01-04", "2014-01-06"))
source <- data.frame(A, begindate, enddate)
source
A begindate enddate
1 a 2014-01-01 2014-01-04
2 b 2014-01-03 2014-01-05
3 a 2014-01-03 2014-01-06
4 b 2014-01-02 2014-01-04
5 c 2014-01-02 2014-01-06
我想从这些数据中创建一个时间序列,例如
2014-01-01 2014-01-02 2014-01-03 2014-01-04 2014-01-05 2014-01-06
a 1 1 2 2 1 1
b 1 2 2 1
c 1 1 1 1 1
原始数据相当大,大约 180k 行。什么是有效的方法?
编辑
David Arenburg 给出的答案效果很好
library(data.table)
library(reshape2)
setDT(mydata)[, indx := .I]
mydata <- mydata[, list(A = A, seq(begindate, enddate, by = 1)), by = indx]
但对于我的数据来说,它相当慢。添加中间步骤显着加快了铸造操作。
# intermediate step (pre-aggregation)
mydata_aggregated <- mydata[, list(number_cases = length(indx)), by = list(A, V2)]
# casting over the aggregated list
mydata_series <- dcast(mydata_aggregated, V2 ~ A, value.var = "number_cases") # note
# that I switched the rows and columns, since I found that its easier to pass this
# data to zoo or xts
# creating the zoo object
mydata_zoo <- zoo(mydata_series[,-1],mydata_series[,1])
【问题讨论】:
-
我对 R 中的时间序列相当陌生。我尝试创建 seq(begindate, enddate) 对象,但我不知道如何聚合它们,因为它们都有不同的开始和结束日期。
-
这个问题不是太宽泛,很清楚他在问什么。所以没有必要因为这两个原因关闭它
-
问题解决了,可以这样标记吗?
-
不需要。当您接受答案时,这意味着它已解决
标签: r dataframe time-series stocks