R和Data.table - 在多列上应用rollapply

时间:2017-08-22 10:16:14

标签: r data.table

如果您可以帮我为每列数据进行rollapply,我将非常感谢。表

    time                AUD NZD   EUR GBP    USD AUD 

1   2013-01-01 20:00    0.213     -0.30467   -0.127515 
2   2013-01-01 20:05    0.21191   -0.30467   -0.127975 
3   2013-01-01 20:10    0.212185  -0.304965  -0.127935 
4   2013-01-01 20:15    0.212055  -0.30511   -0.1288 
5   2013-01-01 20:20    0.211225  -0.30536   -0.12938 
6   2013-01-01 20:25    0.211185  -0.30527   -0.129195 
7   2013-01-01 20:30    0.21159   -0.3059    -0.13043 
8   2013-01-01 20:35    0.21142   -0.304955  -0.13155 
9   2013-01-01 20:40    0.21093   -0.30419   -0.132715 
10  2013-01-01 20:45    0.2078    -0.30339   -0.13544
11  2013-01-01 20:50    0.208445  -0.30304   -0.135645
12  2013-01-01 20:55    0.208735  -0.30185   -0.1357 
13  2013-01-01 21:00    0.20891   -0.303265  -0.13722 
14  2013-01-01 21:05    0.20903   -0.30428   -0.137495
15  2013-01-01 21:10    0.209615  -0.305495  -0.13734 
16  2013-01-01 21:15    0.20981   -0.30588   -0.13772 
17  2013-01-01 21:20    0.209855  -0.306935  -0.13801
18  2013-01-01 21:25    0.209585  -0.30604   -0.138045 
19  2013-01-01 21:30    0.210105  -0.3061    -0.137765 
20  2013-01-01 21:35    0.210335  -0.30734   -0.138525 

有效的代码:

library("zoo")
library("data.table")

calculateAverage <- function (x,N) {
        tempDataStorage <- rollapply(out[,1], N, mean)
}

col1 <- out[,2]
col2 <- out[,3]
col3 <- out[,4]

average1 <- calculateAverage(col1, 2)
average2 <- calculateAverage(col2, 2)
average3 <- calculateAverage(col3, 2)

combine <- cbind(average1, average2, average3)
tempMatrix <- matrix(, nrow = nrow(out), ncol = ncol(out))
tempMatrix[2:nrow(out), 1:3] <- combine

Suggestion from SO

test <- lapply(out[,with=F], function(x) rollapply(x,width=2, FUN=mean))

挑战: 1.我创建的代码有效,但感觉效率低而且不通用。只要cols的数量发生变化,就需要修改它 2. SO输出的建议是对我没用的列表

如果建议采用其他方法,我会非常感激!

提前致谢 编辑: 添加了数据表

2 个答案:

答案 0 :(得分:0)

data <- cbind(mtcars,as.Date(c("2007-06-22", "2004-02-13")))
merge(rollapply(Filter(is.numeric, data), 2, mean),
      Filter(Negate(is.numeric), data))

第一行创建数据,因此其中不仅包含数值。这只是为了模仿您现在无法使用的数据。

第二行仅过滤数字列,并将mean函数应用于每个过滤列。

答案 1 :(得分:0)

David Arenburg的建议完美无缺!

MaPrice <- function(x, N) {
    Mavg <- rollapply(x, N, mean)
    Mavg
}

SpreadMA <- out[, lapply(.SD, MaPrice, N = 20)]