2012-06-13 67 views
0

我有一个包含价格和数量的xts对象。我希望按时间段分割数据并汇总数据,以便获得每个时间段分段的每个价格交易的交易量表。子设置和聚合xts对象

我已经破解了一个部分解决方案,但它笨拙而缓慢;此外,我无法使用模板名称来工作(所以我不能让我的功能工作)。

的XTS对象的子集如下所示:

library(xts) 
mn <- 
structure(c(97.9, 97.9, 97.9, 97.9, 97.9, 97.9, 97.9, 97.89, 
97.89, 97.89, 97.89, 97.89, 97.89, 97.9, 97.9, 97.89, 97.9, 97.89, 
97.89, 97.89, 97.89, 9, 60, 71, 5, 3, 21, 5, 192, 65, 73, 1, 
1, 39, 15, 1, 1, 18, 1, 33, 1, 1), .Dim = c(21L, 2L), .Dimnames = list(
    NULL, c("px_ym1", "vol_ym1")), index = structure(c(1338561000, 
1338561000, 1338561000, 1338561000, 1338561000, 1338561000, 1338561060, 
1338561060, 1338561060, 1338561060, 1338561060, 1338561060, 1338561060, 
1338561060, 1338561060, 1338561060, 1338561060, 1338561060, 1338561120, 
1338561240, 1338561240), tzone = "", tclass = c("POSIXct", "POSIXt" 
)), .indexCLASS = c("POSIXct", "POSIXt"), tclass = c("POSIXct", 
"POSIXt"), .indexTZ = "", tzone = "", class = c("xts", "zoo")) 

我已想出如何使用下面的命令来聚合:

PxMat <- aggregate(.~px_ym1, data=mn, sum) 
    px_ym1 vol_ym1 
1 97.89  408 
2 97.90  208 

和用于子集,我使用以下分组:

PxMat2 <- aggregate(.~px_ym1, data=mn[.indexmin(mn) == '30'], sum) 
    px_ym1 vol_ym1 
1 97.9  169 

我有四个具体问题:

1 /我的数据集很大,所以速度是一个问题。这是分配和聚合xts的最快方式吗?

2 /有没有办法做到这一点的多个拆分?每分钟,每天,每周或每月说一张桌子?

我正在写一个循环函数,它会生成一个表格,报告每个指定时间分割的案例(例如对于四个表格,每个示例数据中有一个分钟)的每个价格交易的交易量。它看起来很慢,而且像某些人已经做得更好。是这样吗?

3 /有没有办法使用模板变量进行子设置?我想用多个数据框来获得带有指定聚集函数(上面再现的)的表格,因为列名会不时地变化。

我曾尝试:

PxMat <- aggregate(.~mn[,1], data=mn, sum) 
    px_ym1 px_ym1 vol_ym1 
1 97.90 1076.79  408 
2 97.89 979.00  208 

这不是一场灾难,但如果有多个列,我想乱七八糟保持在最低水平。我无法弄清楚如何抑制价格系列的聚合。

4 /在相关说明中,是否可以对不同的数据列应用不同的功能?这将是很好,例如,如果表中返回信息:

px_ym1 count vol_ym1 
1 97.90 11  408 
2 97.89 10  208 

跨张贴在R-帮助:https://stat.ethz.ch/pipermail/r-help/2012-June/315499.html

+0

对于交叉发布感到抱歉。我显然是新来的,而且我没有想到这是礼节。我刚刚搜索了跨栏发表礼物,现在明白规则是不可以的。 – ricardo

+0

你今天也问过关于datatable-help的类似问题吗? –

+0

是的,这是基本问题。我试图加快我的功能,并使其更通用,并考虑切换到data.table以获得步伐。在这个阶段,data.table更好地处理聚合步骤(这是将此作为通用函数所需的),但基于时间的子设置对于我来说还不适用(我想我已经做了一个简单的错误,因为你的方法是新颖的)。我想做一个公平的比较,所以我想我会问xts专家。 – ricardo

回答

1

我建议通过电子邮件给你(和rhelp虽然还没有出现)你试试:

adf <- aggregate(vol_ym1 ~ px_ym1, data=mm, sum) 

而且,如果你想以匿名方式做到这一点,但去掉聚集列的,你可以使用的总和:

adf <- aggregate(mm[,-1]~mm[,1], data=mm, sum); adf 

如果您需要不同的列,那么您需要创建一个函数,该函数将对按照拆分标准分离的完整向量或矩阵进行操作。你将需要一个更丰富的例子来获得具体的答案。

+0

再次反映在R-help上:如果我用mnz < - as.zoo(mn)将mn转换为动物园,然后使用聚合函数,但是它使用xts失败,这是有效的(有一些错误警告)。 – ricardo