说我有一个矢量:
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)).谢谢你的答案!
尝试
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)