我有以下深度和温度数据矩阵(855行,2列),并希望获取每列中每3行的平均值。例如:
[1,] -6.7 18.91
[2,] -5.4 18.91
[3,] -4.0 18.59
[4,] -6.7 20.37
[5,] -6.7 20.05
[6,] -2.7 20.21
[7,] -4.0 21.03
[8,] -5.4 20.70
[9,] -4.0 20.87
[10,] -2.7 21.37
[11,] -2.7 21.37
[12,] -2.7 21.37
mean(data[1:3,1])
mean(data[4:6,1])
表示整个矩阵。如何在不手动编写每3行平均值的代码的情况下完成此操作?任何想法或建议都非常感谢。
答案 0 :(得分:6)
使用zoo包中的rollapply
函数。有关详细信息,请参阅?rollapply
。
library(zoo)
rollapply(matrix[,1], width=3, mean, by=3)
示例:
> set.seed(1)
> Data <- matrix(rnorm(30, 100, 50), ncol=2) # some random data
> rollapply(Data[,1], width=3, mean, by=3)
[1] 78.69268 118.40534 130.02559 126.60393 71.48317
> # you could check this out by doing some verification as in:
> mean(Data[1:3, 1])
[1] 78.69268
> mean(Data[4:6, 1])
[1] 118.4053
> mean(Data[7:9, 1]) # and so on ...
[1] 130.0256
如果您想要矩阵中所有列的均值,那么只需在by.column=TRUE
调用中添加rollapply
:
> rollapply(Data, width=3, mean, by=3, by.colum=TRUE)
[,1] [,2]
[1,] 78.69268 114.71187
[2,] 118.40534 138.90166
[3,] 130.02559 81.12249
[4,] 126.60393 106.79836
[5,] 71.48317 74.48399
答案 1 :(得分:4)
尝试使用tapply
和apply
:
R > f <- rep(c(1:3), each = 3)
R > f
[1] 1 1 1 2 2 2 3 3 3
R > x <- matrix(1:27, 9, 3)
R > x
[,1] [,2] [,3]
[1,] 1 10 19
[2,] 2 11 20
[3,] 3 12 21
[4,] 4 13 22
[5,] 5 14 23
[6,] 6 15 24
[7,] 7 16 25
[8,] 8 17 26
[9,] 9 18 27
R > apply(x, 2, function(t) tapply(t, f, mean))
[,1] [,2] [,3]
1 2 11 20
2 5 14 23
3 8 17 26
答案 2 :(得分:1)
我真的很喜欢'rollapply'功能,因为它的语法与你想要做的非常匹配。但是,我认为我会为子孙后代如何使用'plyr'包来解决这个问题。
注意:您可以在一个语句中完成所有操作,但我已将其分解以使其更易于理解。
第1步:将数据设置为具有排序变量。
data.plyr <- data.frame(test, group=floor((1:nrow(test)-1)/3)+1)
我刚刚添加了一个列'组',它为每三列分配一个组号。默认情况下,两个矩阵列现在为“X1”和“X2”。
第2步:为每个组运行'colMeans'功能。
library(plyr)
ddply(data.plyr, .(group), colMeans)
对于这个具体问题,我认为'plyr'包是次优的,但值得注意的是未来参考的方法。 “apply”系列和“rollapply”功能最适用于数据的连续性和一致性。在您需要更多灵活性的应用程序中,“plyr”系列函数对于您的工具箱非常有用。