【问题标题】:Repeating or looping an argument重复或循环参数
【发布时间】:2014-10-22 17:08:56
【问题描述】:

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

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

在我看来应该比较简单,但是不知道从哪里开始。

【问题讨论】:

  • 您可以从zoo 包中查看rollapply()

标签: r vector repeat


【解决方案1】:

使用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

【讨论】:

  • 似乎是迄今为止提交速度最快的一个。
【解决方案2】:

使用来自zoorollapply

 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))

【讨论】:

  • 这些变体也适用:abs(rollmean(vec[1:(n1-n)], 2) - rollmean(vec[(n+1):n1], 2))rollapply(vec, 4, function(x) abs(mean(x[1:2]) - mean(x[3:4])))abs(rollapply(vec, 4, "%*%", c(1, 1, -1, -1)/2))
  • @G。 Grothendieck 感谢您的评论并提供了变化。
【解决方案3】:

一如既往,我附和:

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

【讨论】:

  • 我已经更新了我的答案,稍作改动应该会提高性能并确保正确处理 NA 值。
猜你喜欢
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 2012-11-01
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
  • 2018-04-26
相关资源
最近更新 更多