一般来说,分组是与 R 中的基本操作分开完成的,因此并不是这些函数不能用于分组数据。只是您需要将它们嵌入到分组操作中。这里我们用来ave
进行分组和rollapplyr
滚动sd
。
现在,在每一点我们可以假设最后 90 天是最后 90 行吗?假设是,并采用 2 的滚动标准偏差,以便我们可以使用在最后的注释中可重现地显示的已发布数据的选定行:
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))
根据您的需要将其转换回数据框。
笔记
以可重现形式使用的输入。
Lines <- "Date Country Score
1995-01-01 Australia 100
1995-01-02 Australia 99
1995-01-03 Australia 85
1995-01-01 Austria 67
1995-01-02 Austria 12
1995-01-03 Austria 10"
DF <- read.table(text = Lines, header = TRUE)
DF$Date <- as.Date(DF$Date)