我想创建一个向量,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 中创建这个向量?
我想创建一个向量,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 中创建这个向量?
我认为这是 base 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
您可以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)))
可能只是做一些非常简单的事情,比如:
(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