我遇到多阵列平均问题,例如,我有一个三维4 * 4 * 3阵列x
,
x
, , 1
[,1] [,2] [,3] [,4]
[1,] NA NA NA NA
[2,] 0.5 NA NA NA
[3,] NA NA NA NA
[4,] NA NA NA NA
, , 2
[,1] [,2] [,3] [,4]
[1,] NA NA NA NA
[2,] 0.7 NA NA NA
[3,] 0.4 NA NA NA
[4,] NA NA NA NA
, , 3
[,1] [,2] [,3] [,4]
[1,] NA NA 0.8 NA
[2,] NA NA NA NA
[3,] NA NA NA NA
[4,] NA NA NA NA
我想要的是没有NA的总和,非NA的元素数的平均值:
基本上,结果是这样的 [,1] [,2] [,3] [,4]
[1,] 0 0 0.8 0
[2,] 0.6 0 0 0
[3,] 0.4 0 0 0
[4,] 0 0 0 0
在matlab中,我这样做nansum(x, 3)./sum(~isnan(x), 3)
,
我在R中尝试了很多,比如apply(x, 3, sum, na.rm = T)
或Reduce
,尝试先获得初步结果
[,1] [,2] [,3] [,4]
[1,] 0 0 0.8 0
[2,] 1.2 0 0 0
[3,] 0.4 0 0 0
[4,] 0 0 0 0
但是我仍然没有管理它,有人有任何命中吗?
答案 0 :(得分:4)
使用apply
和na.rm=TRUE
,您走在正确的轨道上。您只需使用参数MARGIN=c(..., ...)
指定要应用的多个维度。
以下是使用内置数据集Titanic
的示例:
str(Titanic)
table [1:4, 1:2, 1:2, 1:2] 0 0 35 0 0 0 17 0 118 154 ...
- attr(*, "dimnames")=List of 4
..$ Class : chr [1:4] "1st" "2nd" "3rd" "Crew"
..$ Sex : chr [1:2] "Male" "Female"
..$ Age : chr [1:2] "Child" "Adult"
..$ Survived: chr [1:2] "No" "Yes"
现在总结第3和第4维度:
apply(Titanic, c(3, 4), sum, na.rm=TRUE)
Survived
Age No Yes
Child 52 57
Adult 1438 654
答案 1 :(得分:3)
也许是这样的:
apply(x, c(1,2), sum, na.rm=TRUE)
请注意,由于缺少可重现的数据集,因此未经测试。
答案 2 :(得分:3)
也许这可能有用
# Creating your array, I know this is an ugly way to do it :D
Array <- array(rep(NA, 16*3), dim=c(4,4,3))
Array[2,1,1] <- 0.5
Array[2:3,1,2] <- c(0.7,0.4)
Array[1,3,3] <-0.8
Array # this is your array, (Array is not is a very original name)
, , 1
[,1] [,2] [,3] [,4]
[1,] NA NA NA NA
[2,] 0.5 NA NA NA
[3,] NA NA NA NA
[4,] NA NA NA NA
, , 2
[,1] [,2] [,3] [,4]
[1,] NA NA NA NA
[2,] 0.7 NA NA NA
[3,] 0.4 NA NA NA
[4,] NA NA NA NA
, , 3
[,1] [,2] [,3] [,4]
[1,] NA NA 0.8 NA
[2,] NA NA NA NA
[3,] NA NA NA NA
[4,] NA NA NA NA
# one way to get what you want could be...
(result <- apply(Array, c(1,2), mean, na.rm=TRUE))
[,1] [,2] [,3] [,4]
[1,] NaN NaN 0.8 NaN
[2,] 0.6 NaN NaN NaN
[3,] 0.4 NaN NaN NaN
[4,] NaN NaN NaN NaN
# if you want zeroes instead of NaN as your desired output example shows...
result[is.nan(result)] <- 0
result
[,1] [,2] [,3] [,4]
[1,] 0.0 0 0.8 0
[2,] 0.6 0 0.0 0
[3,] 0.4 0 0.0 0
[4,] 0.0 0 0.0 0