转换与许多时间序列数据帧进入的单变量XTS

问题描述:

我有时间序列的数据帧列表:转换与许多时间序列数据帧进入的单变量XTS

X1.HK.Equity  X X2.HK.Equity X.2 X3.HK.Equity X.4 
1 31/12/2002 38.855 31/12/2002 19.547 31/12/2002 5.011 
2 02/01/2003 38.664 02/01/2003 19.547 02/01/2003 4.986 
3 03/01/2003 40.386 03/01/2003 19.547 03/01/2003 4.962 
4 06/01/2003 40.386 06/01/2003 19.609 06/01/2003 4.937 
5 07/01/2003 40.195 07/01/2003 19.609 07/01/2003 4.937 
6 08/01/2003 40.386 08/01/2003 19.547 08/01/2003 4.912 

我想利用这个时间序列并改变它的3项的列表,每一个都是从第1-2,3-4和5-6列创建的XTS。请注意,时间序列不一定具有相同的日期。

如果有人能告诉我如何使用plyr库来做到这一点,我会非常高兴。

我的数据帧的dput

structure(list(X1.HK.Equity = c("31/12/2002", "02/01/2003", "03/01/2003", 
"06/01/2003", "07/01/2003", "08/01/2003"), X = c(38.855, 38.664, 
40.386, 40.386, 40.195, 40.386), X2.HK.Equity = c("31/12/2002", 
"02/01/2003", "03/01/2003", "06/01/2003", "07/01/2003", "08/01/2003" 
), X.2 = c(19.547, 19.547, 19.547, 19.609, 19.609, 19.547), X3.HK.Equity = c("31/12/2002", 
"02/01/2003", "03/01/2003", "06/01/2003", "07/01/2003", "08/01/2003" 
), X.4 = c(5.011, 4.986, 4.962, 4.937, 4.937, 4.912)), .Names = c("X1.HK.Equity", 
"X", "X2.HK.Equity", "X.2", "X3.HK.Equity", "X.4"), row.names = c(NA, 
6L), class = "data.frame") 

随着plyr,使用llply

tss = llply(c(1,3,5),function(s){ts=mydf[,s:(s+1)];xts(ts[,2],order.by=as.Date(ts[,1],format="%d/%m/%Y"))}) 

给你

> tss[[1]] 
      [,1] 
2002-12-31 38.855 
2003-01-02 38.664 
2003-01-03 40.386 
2003-01-06 40.386 
2003-01-07 40.195 
2003-01-08 40.386 
> class(tss[[1]]) 
[1] "xts" "zoo" 
> 

即1,3,5向量是更普遍seq(1,ncol(mydf),by=2)

我不知道这是否是做到这一点的最有效的方式,但我希望,这是相当合理的。

library(xts) 
lapply(seq_along(mydf[c(FALSE, TRUE)]), function(x) { 
    xts(mydf[c(FALSE, TRUE)][x], 
     order.by=as.Date(mydf[c(TRUE, FALSE)][, x], format = "%d/%m/%Y")) 
}) 
# [[1]] 
#     X 
# 2002-12-31 38.855 
# 2003-01-02 38.664 
# 2003-01-03 40.386 
# 2003-01-06 40.386 
# 2003-01-07 40.195 
# 2003-01-08 40.386 
# 
# [[2]] 
#    X.2 
# 2002-12-31 19.547 
# 2003-01-02 19.547 
# 2003-01-03 19.547 
# 2003-01-06 19.609 
# 2003-01-07 19.609 
# 2003-01-08 19.547 
# 
# [[3]] 
#    X.4 
# 2002-12-31 5.011 
# 2003-01-02 4.986 
# 2003-01-03 4.962 
# 2003-01-06 4.937 
# 2003-01-07 4.937 
# 2003-01-08 4.912 

基本上,它使用的TRUEFALSE回收选择备用列。 seq_along部分告诉我们有多少对(在本例中为3),而在匿名函数中,我们使用c(FALSE, TRUE)c(TRUE, FALSE)的日期对这些值进行了子集划分。

+0

如果您的数据大,你可能会做的更好创建的子集' mydf'在你的'lapply'函数之外,因为(我认为)这是在lapply每个“循环”中的子集。 – A5C1D2H2I1M1N2O1R2T1 2013-04-07 08:39:33

一个普通lapply将在这里工作:

to.xts <- function(i) as.xts(read.zoo(DF[i+0:1], format = "%d/%m/%Y")) 
lapply(seq(1, ncol(DF), 2), to.xts) 

如果这不只是一个例子,事实上,只有三个系列就足够,以取代最后一行:

list(to.xts(1), to.xts(3), to.xts(5))