拆分,lapply,rbind 范式。 lapply 返回数字列表而不是日期索引

Split, lapply, rbind paradigm. lapply returning lists of numerics instead of date index

我正在对 Red Sox 赛季数据集进行时间序列分析。我需要逐年拆分数据集并进行一些计算,所以我很确定我需要使用拆分、lapply、rbind 范式。我正在将一个 xts 二进制 (win/loss) 列提供给拆分函数,到目前为止一切顺利,它 returns 一个按年份正确拆分的 xts 列表。

然后我在这个列表上 运行 lapply 计算每年 win/loss 的累积平均值,数值结果没问题,但它正在将 xts 对象转换为数值矢量,所以我失去了我的日期索引。

这个问题的根源可能是什么?

谢谢!

red_sox_xts$win 的头像。

            win
2010-04-04   1
2010-04-06   0
2010-04-07   0
2010-04-09   0
2010-04-10   1
2010-04-11   1

1 - 将其提供给此函数以按年拆分。

red_sox_seasons <- split(red_sox_xts$win, f = 'years')

输出:

[[1]]
            win
2010-04-04   1
2010-04-06   0
     .       .
     .       .
     .       .
[[2]]
            win
2011-04-01   0
2011-04-02   0
     .       .
     .       .
     .       .

2 - 接下来我将此输出提供给 lapply 函数。

red_sox_ytd <- lapply(red_sox_seasons, cummean)

输出:(这是 st运行ge 行为开始的地方)

1.   A.1
     B.0.5
      .
      .
      .
2.   A.0
     B.0.5
      .
      .
      .

class(red_sox_ytd) 是一个列表 class(red_sox_ytd[[1]]) 是数字,而它应该是 xts

这让我无法正确执行下一步:

do.call(rbind, red_sox_ytd)

假设最后注释中显示 x 我们可以使用 ave:

按年份计算 cummean
transform(x, cummean = ave(win, format(time(x), "%Y"), FUN = cummean))
##            win   cummean
## 2010-04-04   1 1.0000000
## 2010-04-06   0 0.5000000
## 2010-04-07   0 0.3333333
## 2010-04-09   0 0.2500000
## 2010-04-10   1 0.4000000
## 2010-04-11   1 0.5000000

另一种方法(但更长)是:

do.call("rbind", lapply(split(x, "years"), transform, cummean = cummean(win)))

备注

Lines <- "date win
2010-04-04   1
2010-04-06   0
2010-04-07   0
2010-04-09   0
2010-04-10   1
2010-04-11   1"
library(xts)
x <- as.xts(read.zoo(text = Lines, header = TRUE, drop = FALSE))