3

マルチ配列平均で問題が発生しました。たとえば、3次元の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

しかし、私はまだそれを管理していませんでした、誰かがヒットを持っていますか?

4

3 に答える 3

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
于 2012-07-23T08:36:36.847 に答える
3

多分このようなもの:

apply(x, c(1,2), sum, na.rm=TRUE)

再現可能なデータセットがないため、これはテストされていないことに注意してください。

于 2012-07-23T08:32:51.710 に答える
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
于 2012-07-23T11:16:19.017 に答える