我有一个数据集,例如
a<-c(1,2,3,4,5,6,7,8,9)
我想计算每三个连续数据值的平均值。比如,数据值
1:3,4:6,7:9
我应该使用什么命令?
答案 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
,然后tapply
将mean
应用于每个组中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