[英]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.