重复或循环参数

时间:2014-10-22 17:08:56

标签: r vector repeat

我对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

然而,我希望有一个自动例程,让我可以在长向量上执行此操作,并更改用于计算均值的值的数量。

在我看来它应该相对简单,但我不知道从哪里开始。

3 个答案:

答案 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