簡體   English   中英

基於矩陣索引 R 數組

[英]Indexing an R array based on matrix

我正在使用代表不同變量 (1000,800,365) 的相對較大的 arrays; 第三個維度是以天為單位的時間。 對於每一行和每一列,我想根據一個變量的最大值計算兩件事:另一個變量的總和以及該值小於或等於給定值的天數。

我已經使用 apply() 找到最大值及其 position。我無法弄清楚如何計算我想要的變量(嘗試了各種索引和循環方法)。

由於我正在處理的數據非常大,我一直在使用以下方法進行故障排除(x1 被用作最大值的數組)。

set.seed(1)
x1 <- array(round(runif(n = 600, min = 0, max = 300)), c(5,10,12))
x2 <- array(round(runif(n = 600, min = 0, max = 200)), c(5,10,12))
x1.max <- apply(x1, c(1,2), max)
x1.max.pos <- apply(x1, c(1,2), which.max)

最終,我想要兩個 1000x800 矩陣(一個在 x2.max 之后有 x2 的總和,另一個在 x2.max 之后出現的次數等於一個值)一旦一切都說完了。

編輯添加:這是關於我正在尋找的內容的一些額外說明

> x1.max.pos <- apply(x1, c(1,2), which.max)
> x1.max <- apply(x1, c(1,2), max)
x1.max.pos
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]   10    7    9   10    3    7    7    9    7     2
[2,]    6    1    4    1   10    2   12    8   11    11
[3,]    9   10    7    1    8    9    4    8    6     9
[4,]    3    3    5    7    7   11    8    3    4    10
[5,]    8    9   12   12    5   11    3    7   12     5
> x2[1,1,]
 [1] 163 135 186  99 172 189 166  19 106   9 138 168
> sum(x2[1,1,10:12])
[1] 315
> x2[2,1,]
 [1] 186 169 180 180   7 149 153  36 137 107  51  16
> sum(x2[2,1,6:12])
[1] 649 

在 x2[1,1,] 處,我想找到 x1.max.pos[1,1] 中標識的數字之后的值的總和。 我的最終矩陣的第一行第一列的值為 315,第二行第一列的值為 649。

從那里,我最終需要知道每行和每列的值大於 0 的次數(我知道樣本矩陣不能正常工作)。

更新

隨着更新,OP 真正想要什么變得很清楚。 這是此問題的解決方案:

res <- vapply(seq_along(x1.max.pos), 
       function(i) {
          sum(x2[row(x1.max.pos)[i], 
                 col(x1.max.pos)[i], 
                 seq(x1.max.pos[i], dim(x1)[3])])
       }, 
       double(1L)
)

dim(res) <- dim(x1.max.pos)
res

這個想法相當簡單:遍歷所有最大位置,從x2中取出相應的切片並將其求和。 由於維度在此循環中丟失,我們必須重新分配它。

舊答案

我不完全理解您的預期結果,但我想sweep可以提供幫助:

 apply(sweep(x2, 1:2, x1.max, function(x, s) { res <- x - s res[res < 0] <- 0 res}), 1:2, sum)

這個想法是您提供一個匯總統計數據(例如x1.max )和一個 function ,它對數據和這個匯總統計數據進行操作。 他的 function 獲取您的數據和摘要統計信息的相應位置,並執行您告訴它執行的任何操作。

這里我簡單地減去最大值,並將負值(即小於最大值的值)設置為零(沒什么用,但只是為了突出這個想法)。 然后您需要再運行一次以應用以聚合數據。

這有幫助嗎?

暫無
暫無

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

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