子设置和聚合xts对象

时间:2012-06-13 13:12:46

标签: r aggregate data.table 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-help上交叉发布:https://stat.ethz.ch/pipermail/r-help/2012-June/315499.html

1 个答案:

答案 0 :(得分:1)

我通过电子邮件向您建议(以及rhelp虽然尚未出现)您尝试:

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

如果您想匿名执行此操作,并删除可以使用的聚合列的总和:

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

如果您需要不同的列,则需要创建一个函数,该函数将对按拆分条件隔离的完整向量或矩阵进行操作。您将需要一个更丰富的示例来获得具体答案。