计算向量中每 n 个值的平均值 [英] calculating mean for every n values from a vector
问题描述
所以假设我有一个向量
a <- rnorm(6000)
我想计算第 1 个值到第 60 个值的平均值,然后再次计算第 61 个值到第 120 个值的平均值,以此类推.所以基本上我想计算每 60 个值的平均值,从该向量给我 100 个平均值.我知道我可以做一个 for 循环,但我想知道是否有更好的方法来做到这一点?
I want to calculate the mean of the 1st value to the 60th, then again calculate the mean for the 61st value to the 120th and so fourth. So basically I want to calculate the mean for every 60th values giving me 100 means from that vector. I know I can do a for loop but I'd like to know if there is a better way to do this?
推荐答案
我会使用
colMeans(matrix(a, 60))
.colMeans(a, 60, length(a) / 60) # more efficient (without reshaping to matrix)
<小时>
增强用户adunaic的请求
Enhancement on user adunaic's request
这仅在有 60x100 数据点时才有效.如果你最后有一个不完整的 60 那么这个错误.最好有一个通用的解决方案,让其他人在这个问题上寻找想法.
This only works if there are 60x100 data points. If you have an incomplete 60 at the end then this errors. It would be good to have a general solution for others looking at this problem for ideas.
BinMean <- function (vec, every, na.rm = FALSE) {
n <- length(vec)
x <- .colMeans(vec, every, n %/% every, na.rm)
r <- n %% every
if (r) x <- c(x, mean.default(vec[(n - r + 1):n], na.rm = na.rm))
x
}
a <- 1:103
BinMean(a, every = 10)
# [1] 5.5 15.5 25.5 35.5 45.5 55.5 65.5 75.5 85.5 95.5 102.0
<小时>
分组操作的替代解决方案(效率较低)
BinMean2 <- function (vec, every, na.rm = FALSE) {
grp <- as.integer(ceiling(seq_along(vec) / every))
grp <- structure(grp, class = "factor",
levels = as.character(seq_len(grp[length(grp)])) )
lst <- .Internal(split(vec, grp))
unlist(lapply(lst, mean.default, na.rm = na.rm), use.names = FALSE)
}
<小时>
速度
library(microbenchmark)
a <- runif(1e+4)
microbenchmark(BinMean(a, 100), BinMean2(a, 100))
#Unit: microseconds
# expr min lq mean median uq max
# BinMean(a, 100) 40.400 42.1095 54.21286 48.3915 57.6555 205.702
# BinMean2(a, 100) 1216.823 1335.7920 1758.90267 1434.9090 1563.1535 21467.542
这篇关于计算向量中每 n 个值的平均值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!