在矢量不同长度的滚动总和

mts*_*mts 0 r

说我有一个矢量:

vec = 1:10
vec
[1]  1  2  3  4  5  6  7  8  9 10
Run Code Online (Sandbox Code Playgroud)

对于不同的整数,k我想要我的向量的k个连续元素的总和,即我对k = 1的期望输出是向量本身

[1]  1  2  3  4  5  6  7  8  9 10
Run Code Online (Sandbox Code Playgroud)

并且对于k = 2:

[1]  3  5  7  9  11  13  15  17  19
Run Code Online (Sandbox Code Playgroud)

等等 - 在这个例子中,k = 10是我想要的最后一个:

[1] 55
Run Code Online (Sandbox Code Playgroud)

即我向量的所有10个条目的总和.

在我的实际数据vec中,长度约为10 ^ 6,k=1:1000条目是带符号的实数.

编辑:我对性能很好奇所以我做了我的第一个基准:

> library(RcppRoll)
> library(zoo)
> library(microbenchmark)
> 
> f <- Vectorize(function(x, k)RcppRoll::roll_sum(x, k),  vectorize.args = "k")
> out = list()
> vec = na.omit(myrealdata)
> vec = vec[1:1e4]
> mb = microbenchmark(Khashaa = f(vec, 1:100), 
+                     mra68 = for(k in (1:100)){out[[k]] <- k*rollmean(vec, k)}, 
+                     akrun = sapply(1:100, function(x) rollsum(vec, k=x)), times = 100)
> print(mb)
Unit: milliseconds
    expr       min        lq      mean    median        uq        max neval
 Khashaa  48.12953  49.08398  49.89553  49.55445  50.27705   53.23208   100
   mra68 557.93112 564.74246 578.07404 568.95936 576.81239  858.52096   100
   akrun 549.48471 556.68814 570.50853 560.17078 565.31508 1190.12545   100
Run Code Online (Sandbox Code Playgroud)

我测试了部分真实数据和较小的数据k(k由于RAM问题导致所有算法变慢).Khashaa的算法是明显的赢家,并且还能够处理NAs.然而,根据akrun和mra68建议的答案,这可以完成rollapply(... mean(..., na.rm=T)).谢谢你的答案!

Kha*_*haa 6

尝试

x <- 1:10
k <- 1:10
f <- Vectorize(function(x, k)RcppRoll::roll_sum(x, k),  vectorize.args = "k")
f(x, k)


[[1]]
 [1]  1  2  3  4  5  6  7  8  9 10

[[2]]
[1]  3  5  7  9 11 13 15 17 19

[[3]]
[1]  6  9 12 15 18 21 24 27

[[4]]
[1] 10 14 18 22 26 30 34

[[5]]
[1] 15 20 25 30 35 40

[[6]]
[1] 21 27 33 39 45

[[7]]
[1] 28 35 42 49

[[8]]
[1] 36 44 52

[[9]]
[1] 45 54

[[10]]
[1] 55
Run Code Online (Sandbox Code Playgroud)