我对矢量或数组操作有点麻烦。
我有三个3D阵列,我想找到它们的平均值。我怎样才能做到这一点?我们不能使用mean()
,因为它只返回一个值。
更重要的是阵列中的一些细胞是NA,这意味着如果我只是添加它们
A = (B + C + D)/3
结果也将显示NA。
如何让它识别出单元格是否为NA然后才跳过它。
喜欢
A = c(NA, 10, 15, 15, NA)
B = c(10, 15, NA, 22, NA)
C = c(NA, NA, 20, 26, NA)
我想要平均这些向量的输出
(10, (10+15)/2, (15+20)/2, (15+22+26)/3, NA)
我们也不能使用na.omit
,因为它会移动索引的顺序。
这是相应的代码。我希望它会有所帮助。
for (yr in 1950:2011) {
temp_JFM <- sst5_sst2[,,year5_sst2==yr & (month5_sst2>=1 & month5_sst2<=3)]
k = 0
jfm=4*k+1
for (i in 1:72) {
for (j in 1:36) {
iposst5_sst2[i,j,jfm] <- (temp_JFM[i,j,1]+temp_JFM[i,j,2]+temp_JFM[i,j,3])/3
}
}
}
不管你。
它已经解决了。
最简单的纠正方法如下所示。
iposst5_sst2[i,j,jfm] <- mean(temp_JFM[i,j,],na.rm=TRUE)
答案 0 :(得分:7)
我不完全确定你想要的输出是什么,但我猜你真正想要构建的不是三个3D阵列,而是一个4D阵列,你可以使用apply
。< / p>
这样的事情:
#Three 3D arrays...
A <- array(runif(1:27),dim = c(3,3,3))
B <- array(runif(1:27),dim = c(3,3,3))
C <- array(runif(1:27),dim = c(3,3,3))
#Become one 4D array
D <- array(c(A,B,C),dim = c(3,3,3,3))
#Now we can simply apply the function mean
# and use it's na.rm = TRUE argument.
apply(D,1:3,mean,na.rm = TRUE)
答案 1 :(得分:2)
这是一个示例,它使三个值的向量,使na.omit可用:
vectorAverage <- function(A,B,C) {
Z <- rep(NA, length(A))
for (i in 1:length(A)) {
x <- na.omit(c(A[i],B[i],C[i]))
if (length(x) > 0) Z[i] = mean(x)
}
Z
}
导致:
vectorAverage(A,B,C)
[1] 10.0 12.5 17.5 21.0 NA
编辑:在第一个版本的输出中错过了NaN。