我想创建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中创建此向量?
答案 0 :(得分:5)
我认为这些是R可以为您提供的两种最快的方法:
head(filter(x, c(0.5, 0.5)), -1)
或
(head(x, -1) + tail(x, -1)) * 0.5
第一个优点是它可以很容易地推广到任意数量的元素。第二个看起来很像@ user1609452,但速度提高约40%,因为head
和tail
比负索引更快,乘以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
答案 1 :(得分:3)
您可以使用库rollmean()
中的zoo
,您可以在其中选择滚动窗口的长度(在本例中为2)。在我的计算机上,这需要0.01,而你的解决方案是0.16。
library(zoo)
y<-rollmean(x,2)
您可以使用函数rowMeans()
来计算使用向量x的head()
和tail()
制作的矩阵的每行的平均值。
rowMeans(cbind(head(x,n=-1),tail(x,n=-1)))
答案 2 :(得分: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