2016-06-28 42 views
0

索引陣列讓我們假設我有dim(x) <- c(3,3,3)陣列。我也有一個df或矩陣與兩個**列包含我需要的索引組合。的R - 使用陣列

當我通過x[df[[1]],df[[2]],]我得到一個非常大的數組,然後我需要去通過,並採取對角線使用應用功能。這是非常記憶和時間低效的。是否有某種快捷方式(不使用for循環)來索引數組,以便返回df要求的值的向量。

簡單的例子:

`a <- array(1:27,dim = c(3,3,3)) 
df <- data.frame(c(1,2,2,1,3,2),c(2,3,2,1,3,2))` 

在這個例子中,我想要通過類似「a[df[[1]],df[[2]],]」 並得到這樣的事情(或調換):

. [,1] [,2] [,3] [,4] [,5] [,6] [1,] 4 8 5 1 9 5 [2,] 13 17 14 10 18 14 [3,] 22 26 23 19 27 23 當我傳遞函數現在,我得到一個dim = c(6,6,3)的三維數組,作爲更有幫助的dim = c(6,3)。我可以輕鬆地apply(result, 3,diag)得到我想要的東西,但是當DF >> 6它佔用了大量的空間(如空間750GB,並引發警告,錯誤和停止開始前執行)

+0

'x = 1:27; dim(x)< - c(3,3,3); X [cbind(1,2,3)]'你可以看到更多的關於這方面'Extract' – Frank

+0

請閱讀'幫助(「[」)':「索引的第三種形式是通過與一列的數字矩陣對於每個維度:索引矩陣的每一行隨後選擇所述陣列的單個元件,其結果是一個矢量」 – Roland

+0

密切相關:http://stackoverflow.com/q/10865337/ – Frank

回答

2

這工作

temp <- array(1:27, dim=c(3,3,3)) 
df <- data.frame(a=c(1,2,3), b=c(1,2,3), c=c(1,2,3)) 

temp[cbind(df[[1]], df[[2]], df[[3]])] 
[1] 1 14 27 

這有時被稱爲矩陣索引。

要查詢兩個維度並將第三個維度打開,您可以使用正則矩陣子集:例如,要爲每個「z」維矩陣選擇第一行和第二列,你可以使用類似temp[1:2, 2,]或從您的數據集:

temp[1:2, 2,] 
    [,1] [,2] [,3] 
[1,] 4 13 22 
[2,] 5 14 23 

temp[df[[1]][1:2], df[[2]][2], ] 
    [,1] [,2] [,3] 
[1,] 4 13 22 
[2,] 5 14 23 

這當然是相同的。