簡體   English   中英

R:數組-減少長度(泛化)

[英]R: arrays - reducing length (generalization)

我需要減少R中數組的長度(一般化)。例如,我有像這樣的高分辨率數據...

my_array=array(c(sample(0:9,32, replace=TRUE)), dim=c(4,4,2))
> my_array
, , 1

     [,1] [,2] [,3] [,4]
[1,]    2    1    8    2
[2,]    3    5    4    6
[3,]    2    8    9    6
[4,]    1    0    9    9

, , 2

     [,1] [,2] [,3] [,4]
[1,]    3    7    9    7
[2,]    9    4    9    8
[3,]    8    6    7    8
[4,]    7    6    9    9

...並且我需要使用以下均值函數將其“一般化”為低分辨率:

, , 1

     [,1] [,2]
[1,] 2.75 4.00
[2,] 2.75 8.25

, , 2

     [,1] [,2]
[1,] 5.75 8.25
[2,] 6.75 8.25

簡單來說,原始數組的4個值(位置[1,1]; [1,2]; [2,1]; [2,2])在結果數組中的[1,1]位置形成1個值(平均值) 。 我曾嘗試在陣列上使用“套用”,但無法應付“非標准”的邊距。 還有像R中的apply這樣更復雜的功能嗎?

我想對此發表評論,但是我沒有足夠的聲譽,因此我在這里發表評論。

我在這里找到了類似的問題和答案。

根據我找到的答案,針對您的問題的解決方案可能是:

my_array=array(c(sample(0:9,32, replace=TRUE)), dim=c(4,4,2))
my_array

rmean <- array(c(matrix(0,2,2),matrix(0,2,2)),dim=c(2,2,2))  # result array
for (i in 1:2){
  for (j in 1:2){
    for (k in 1:2){
      rmean[,,k][i, j] <- mean(my_array[,,k][c(-1,0) + 2 * i, c(-1,0) + 2 * j])
    }
  }
}
rmean

結果:

> my_array
, , 1

     [,1] [,2] [,3] [,4]
[1,]    8    4    4    9
[2,]    0    7    9    5
[3,]    2    7    2    6
[4,]    9    5    8    6

, , 2

     [,1] [,2] [,3] [,4]
[1,]    2    1    4    7
[2,]    3    7    0    6
[3,]    2    8    9    3
[4,]    7    9    1    9

> rmean
, , 1

     [,1] [,2]
[1,] 4.75 6.75
[2,] 5.75 5.50

, , 2

     [,1] [,2]
[1,] 3.25 4.25
[2,] 6.50 5.50

這是一個與@crwang改編的解決方案非常相似的解決方案,但可以歸納為一個函數:

reduceMatrix <- function(x, rown, coln, fun = mean, ...) {
  out <- matrix(NA,  nrow=nrow(x)/rown, ncol=ncol(x)/coln)
  for (i in 1:(nrow(x)/rown)) {
    for (j in 1:(ncol(x)/coln)) {
      indi <- c(rown*i-1, rown*i)
      indj <- c(coln*j-1, coln*j)
      out[i, j] <- fun(x[indi, indj], ...)  
    }
  }
  out
}

該函數適用於二維數組,因此您可以將它們應用於my_array的第三維:

set.seed(10)
my_array <- array(c(sample(0:9,32, replace=TRUE)), dim=c(4,4,2))

lapply(seq_len(dim(my_array)[3]), 
       function(a) reduceMatrix(my_array[,,a], 2, 2))

[[1]]

     [,1] [,2]
[1,]  2.5  4.0
[2,]  3.5  4.5

[[2]]
     [,1] [,2]
[1,] 4.00 5.25
[2,] 5.25 3.75

這種方法的想法是具有一個功能,該功能既可以用於獨立的矩陣(在3D數組,列表等中),也可以更輕松地選擇要聚合的行數( rown )和列( coln ),以及應用函數( meanmediansum )和其他參數(例如na.rm )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM