如何计算R中某些连续数据值的平均值

时间:2014-09-03 13:05:22

标签: r

我有一个数据集,例如

a<-c(1,2,3,4,5,6,7,8,9)

我想计算每三个连续数据值的平均值。比如,数据值

1:3,4:6,7:9

我应该使用什么命令?

4 个答案:

答案 0 :(得分:1)

这是另一种方式:

制作另一个包含1:3,4:6,7:9

级别的向量
a<-c(1,2,3,4,5,6,7,8,9)
b<-rep(1:3,each=3)
x<-ave(a, b, FUN=mean)  #use ave to find the means
x
#[1] 2 2 2 5 5 5 8 8 8  - gives this output

x[seq(1, length(x), 3)]  #this will output every 3rd element, giving:
#[1] 2 5 8

如果你想要它在一行:

ave(a, rep(1:3,each=3), FUN=mean)[seq(1, length(a), 3)]

另外一种方法 - 使用一些滚动平均函数(例如从ZOO包或TTR包中)并选择每个的第3个元素:

library(TTR)
runMean(a,3)[seq(3, length(a), 3)]
#[1] 2 5 8

当然这个原则可以扩展到计算滚动平均值的基本方法:

filter(a, rep(1/3,3), sides=1)[seq(3, length(a), 3)]

答案 1 :(得分:1)

这是一种可能的RcppRoll方法

library(RcppRoll)
n <- 3 # The summing range
a <- 1:9 # Your vector
roll_mean(a, n)[seq_len(length(a) - n + 1) %% n == 1]
## [1] 2 5 8

答案 2 :(得分:1)

1)rollapply 试试这个:

library(zoo)
a <- 1:9
rollapply(a, 3, mean, by = 3, align = "left", partial = TRUE)
## [1] 2 5 8

如果a的长度不是3的倍数,它也有效,在这种情况下,它仍然是最后的小部分的平均值。如果您希望删除末尾的任何小部分,则省略partial=TRUE参数。如果你知道a的长度总是3的倍数,那么partial = TRUE参数可以省略,因为它在那种情况下没有效果。

2)tapply 这是第二种替代方法。 c(gl(n, 3, n))创建一个长度为c(1, 1, 1, 2, 2, 2, ...))的分组向量n,然后tapplymean应用于每个组中a的值:

n <- length(a)
tapply(a, c(gl(n, 3, n)), mean)
## 1 2 3 
## 2 5 8 

3)聚合tapply类似,但提供数据框作为输出:

n <- length(a)
group <- gl(n, 3, n)
aggregate(a ~ group, FUN = mean)
##   group a
## 1     1 2
## 2     2 5
## 3     3 8

答案 3 :(得分:0)

这对我也很有用:

v  <- 1:9  # a given vector
gr <- 3    # consider a sequence of 3 consecutive elements
length(v) <- prod(dim(matrix(v, nrow=gr))) # will stretch the vector with NA-s if needed
colMeans(matrix(v, nrow=gr), na.rm=TRUE)
[1] 2 5 8

从向量转换为矩阵时需要注意回收。例如:

v  <- 1:11
gr <- 3 
length(v) <- prod(dim(matrix(v, nrow=gr))); v
[1]  1  2  3  4  5  6  7  8  9 10 11 NA

# Will warn about the recycling 
# Warning message:
# In matrix(v, nrow = gr) :
#  data length [11] is not a sub-multiple or multiple of the number of rows [3]
# But the conversion will take place considering the NA-s:

m <- matrix(v, nrow=gr); m
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   NA
colMeans(m, na.rm=TRUE)
[1]  2.0  5.0  8.0 10.5

data.table

的选项
dt <- data.table(1:11, rep(1:3,each=3))
dt
    V1 V2
 1:  1  1
 2:  2  1
 3:  3  1
 4:  4  2
 5:  5  2
 6:  6  2
 7:  7  3
 8:  8  3
 9:  9  3
10: 10  1
11: 11  1
dt[, mean(V1), by = rleid(V2)]$V1
[1]  2.0  5.0  8.0 10.5