2016-09-01 2 views
3

ich eine große Auswahl haben, ist dies ein replizierbar Beispiel:Dimension Funktion auf dem dritten Array anwenden

cube <- array(c(1:10,5:15,-5:+5,1:18), c(4, 4, 3)) 
cube 
, , 1 

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

, , 2 

    [,1] [,2] [,3] [,4] 
[1,] 11 15 -2 2 
[2,] 12 -5 -1 3 
[3,] 13 -4 0 4 
[4,] 14 -3 1 5 

, , 3 

    [,1] [,2] [,3] [,4] 
[1,] 1 5 9 13 
[2,] 2 6 10 14 
[3,] 3 7 11 15 
[4,] 4 8 12 16 

Ich möchte diese Funktion für jeden „Boden“ meiner Array (3. Dimension) anzuwenden:

m1 <- cube[,,1] 
m2 <- cube[,,2] 
m3 <- cube[,,3] 
library(data.table) 
m1[] <- frank(-m1, ties.method = "dense") 
m2[] <- frank(-m2, ties.method = "dense") 
m3[] <- frank(-m3, ties.method = "dense") 

Dann, da das replizierbare Beispiel sehr klein ist. Ich kann die abschließende Arbeit des Kombinierens Matrizen leicht durch:

z <- array(c(m1 , m2, m3) , dim = c(4 , 4 , 3)) 
z 
, , 1 

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

, , 2 

    [,1] [,2] [,3] [,4] 
[1,] 5 1 13 9 
[2,] 4 16 12 8 
[3,] 3 15 11 7 
[4,] 2 14 10 6 

, , 3 

    [,1] [,2] [,3] [,4] 
[1,] 16 12 8 4 
[2,] 15 11 7 3 
[3,] 14 10 6 2 
[4,] 13 9 5 1 

Ich brauche einen schnellen Weg, dies in meinem großen Array zu tun. Irgendwelche Hilfe? Danke.

+2

Ich würde Ihr Array in eine data.table "schmelzen" und damit arbeiten. Sie können aber auch 'apply' verwenden. – Roland

+4

Der anwendbare Weg: 'array (apply (-cube, 3, frank, ties.method =" dicht "), dim (cube)), aber ich würde nicht erwarten, dass es schnell ist. Ich denke Rolands Idee ist wahrscheinlich besser. – Frank

Antwort

0

Die Funktion apply ist dafür gemacht. Das zweite Argument MARGIN gibt die Dimension an, auf die Sie die Funktion anwenden.

res <- apply(-cube, 3, frank, ties.method = "dense") 
## reshape: 
array(res, dim=dim(cube)) 
+1

Danke @Frank für das Hinzeigen. Ich habe meine Antwort bearbeitet. –

Verwandte Themen