2

我想创建一个向量,mean它是向量的第一个和第二个、第二个和第三个元素的平均值x

例如,我写了这段代码:

   x = rnorm(10000)
   > system.time(sapply(1:(length(x)-1), function(i)   mean(c(x[i], x[i+1]))))
    user  system elapsed 
    0.24    0.00    0.23

有没有更快更有效的方法在 R 中创建这个向量?

4

3 回答 3

5

我认为这是 base R 可以为您提供的两种最快的方法:

head(filter(x, c(0.5, 0.5)), -1)

或者

(head(x, -1) + tail(x, -1)) * 0.5

第一个的优点是它可以很容易地推广到任意数量的元素。第二个看起来很像@user1609452,但它快了大约 40%,因为headtail比负索引更快,乘以 0.5 比除以 2 快。

x = rnorm(100000)
library(rbenchmark)
benchmark((head(x, -1) + tail(x, -1)) / 2,
          (head(x, -1) + tail(x, -1)) * 0.5,
          (x[-length(x)] + x[-1]) / 2,
          (x[-length(x)] + x[-1]) * 0.5,
          rollmean(x, 2),
          head(filter(x, c(0.5, 0.5)), -1))
#                                test replications elapsed relative user.self sys.self
# 2 (head(x, -1) + tail(x, -1)) * 0.5          100   0.581    1.000     0.478    0.103
# 1     (head(x, -1) + tail(x, -1))/2          100   0.615    1.059     0.522    0.093
# 4     (x[-length(x)] + x[-1]) * 0.5          100   0.786    1.353     0.697    0.091
# 3         (x[-length(x)] + x[-1])/2          100   0.831    1.430     0.736    0.095
# 6  head(filter(x, c(0.5, 0.5)), -1)          100   0.583    1.003     0.426    0.158
# 5                    rollmean(x, 2)          100  27.040   46.540    25.445    1.593
于 2013-05-31T10:59:13.847 回答
3

您可以rollmean()从库zoo中使用,您可以在其中选择滚动窗口的长度(在这种情况下为 2)。在我的电脑上,这需要 0.01,而您的解决方案需要 0.16。

library(zoo)    
y<-rollmean(x,2)

更新 - 具有基本功能的解决方案

您可以使用函数来计算由向量 x和向量rowMeans()组成的矩阵的每一行的平均值。head()tail()

rowMeans(cbind(head(x,n=-1),tail(x,n=-1)))
于 2013-05-31T09:53:57.400 回答
3

可能只是做一些非常简单的事情,比如:

(x[-length(x)] + x[-1])/2


> library(rbenchmark)
> benchmark((x[-length(x)] + x[-1])/2, sapply(1:(length(x)-1), function(i)   mean(c(x[i], x[i+1]))))
                                                            test replications elapsed relative user.self sys.self
2 sapply(1:(length(x) - 1), function(i) mean(c(x[i], x[i + 1])))          100  20.548  446.696    20.329    0.004
1                                      (x[-length(x)] + x[-1])/2          100   0.046    1.000     0.044    0.000
  user.child sys.child
2          0         0
1          0         0
于 2013-05-31T10:32:08.470 回答