我的数据集很长,格式如下:
Date Country Score
1995-01-01 Australia 100
1995-01-02 Australia 99
1995-01-03 Australia 85
: : :
: : :
2019-06-30 Australia 57
1995-01-01 Austria 67
1995-01-02 Austria 12
1995-01-03 Austria 10
: : :
: : :
2019-06-30 Austria 21
我想为每个国家/地区计算得分的90天滚动标准偏差。我尝试使用rollapply
函数(Package:zoo)和roll_sd
(Package:RcppRoll),但它们不适用于逐组标准差。有人可以建议一种计算滚动标准偏差的可行方法。
谢谢!
答案 0 :(得分:0)
通常,分组是与R中的基本操作分开进行的,因此并不是那些功能不能用于分组数据。只是您需要将它们嵌入分组操作中。在这里,我们使用Export Collections to BigQuery
进行分组,使用ave
进行滚动rollapplyr
。
现在,我们可以在每个点上假设过去90天是最后90行吗?假设是,并且滚动标准偏差为2,那么我们可以使用结尾处的注释中可重复显示的已发布数据的选定行:
sd
给予:
library(zoo)
roll <- function(x) rollapplyr(x, 2, sd, fill = NA)
transform(DF, roll = ave(Score, Country, FUN = roll))
另一种方法是将数据转换为宽格式,然后执行滚动操作:
Date Country Score roll
1 1995-01-01 Australia 100 NA
2 1995-01-02 Australia 99 0.7071068
3 1995-01-03 Australia 85 9.8994949
4 1995-01-01 Austria 67 NA
5 1995-01-02 Austria 12 38.8908730
6 1995-01-03 Austria 10 1.4142136
给出这个动物园系列:
library(zoo)
z <- read.zoo(DF, split = "Country")
zr <- rollapplyr(z, 2, sd, fill = NA)
zr
然后,您可以将其保留为动物园系列,以便利用该程序包中的其他时间序列功能,也可以使用 Australia Austria
1995-01-01 NA NA
1995-01-02 0.7071068 38.890873
1995-01-03 9.8994949 1.414214
或fortify.zoo(zr)
将其转换回数据帧,具体取决于您需要什么。
以可复制形式使用的输入。
fortify.zoo(zr, melt = TRUE, names = names(DF))