拆分,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))
我正在对 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))