我对R很熟悉,因为我已经使用它几年了。不幸的是,我不太精通创建涉及循环或重复方程的函数。问题如下:
我有一个包含超过1000个值的向量。我想计算两个相等大小的并置方法与该向量的子集之间的绝对差值。
这是一个例子。
我有长度为8的向量(vec)
[1] 0.12472963 1.15341289 -1.09662288 -0.73241639 0.06437658 -0.13647136 -1.52592048 1.46450084
我想计算前2个值的平均值(0.12472963,1.15341289)并获得与以下2个值(-1.09662288 -0.73241639)的平均值的绝对差值,然后沿着向量的方向工作。
在这种情况下,我可以轻松使用以下等式:
abs(mean(vec[1:2])-mean(vec[3:4]))
并逐步增加每个数字1,以便手动向下工作直到向量结束。我会得到以下矢量。
[1] 1.553591 0.3624149 0.8784722 0.497176 0.005337574
然而,我希望有一个自动例程,让我可以在长向量上执行此操作,并更改用于计算均值的值的数量。
在我看来它应该相对简单,但我不知道从哪里开始。
答案 0 :(得分:7)
使用filter
:
c(abs(filter(vec, c(0.5, 0.5, -0.5, -0.5), sides=1)[-(1:3)]))
#[1] 1.55359090 0.36241491 0.87847224 0.49717601 0.00533757
答案 1 :(得分:2)
使用rollapply
zoo
library(zoo)
n <- 2
n1 <- length(vec)
abs(rollapply(vec[1:(n1-n)], 2, mean)-rollapply(vec[(n+1):n1], 2,mean))
#[1] 1.55359090 0.36241491 0.87847224 0.49717601 0.00533757
此外,上述代码的其他变体(来自@G.Grothendieck- zoo
包的作者之一)
abs(rollmean(vec[1:(n1-n)], 2) - rollmean(vec[(n+1):n1], 2)) #using
#`rollmean` instead of `rollapply`
或
rollapply(vec, 4, function(x) abs(mean(x[1:2]) - mean(x[3:4])))
或
abs(rollapply(vec, 4, "%*%", c(1, 1, -1, -1)/2))
答案 2 :(得分:1)
与往常一样,我会说:
vec<-rep(c( 0.12472963 , 1.15341289, -1.09662288, -0.73241639 , 0.06437658, -0.13647136 ,-1.52592048 , 1.46450084 ),100)
microbenchmark(roland(vec),akrun(vec),times=3)
Unit: microseconds
expr min lq mean median uq max
roland(vec) 564.128 565.2275 647.3353 566.327 688.939 811.551
akrun(vec) 3717.410 3982.1535 4218.3057 4246.897 4468.753 4690.610
neval
3
3