Mam trójwymiarową tablicę w R, np.

a <- array(1:24, dim=c(2,3,4))

Odnoszę się do wymiarów tej tablicy jako rzędy, kolumny i warstwy. Mam drugą zmienną, b , która ma na celu przedstawienie indeksu do tej tablicy, np.

b <- array(c(1,4,3,2,2,1), dim=c(2,3))

Chciałbym uzyskać zmienną dwuwymiarową, d , która zawiera wartość z zmiennej 3D A w warstwie określonej przez b dla każdego wiersza i kolumna w a i b . Tak więc na przykład d[1, 1] <- a[1, 1 , b[1, 1]] i d[2, 3] <- a[2, 3, b[2, 3]] i tak dalej. W tym przykładzie powinienem skończyć z:

 d == array(c(1, 20, 15, 10, 11, 6), dim=c(2, 3))

Jaki jest najbardziej skuteczny sposób?

1
Barbara 4 czerwiec 2018, 10:07

3 odpowiedzi

Najlepsza odpowiedź

Najszybszy sposób, jaki możesz to zrobić:

structure(a[cbind(c(row(b)),c(col(b)),c(b))],.Dim=dim(b))
     [,1] [,2] [,3]
[1,]    1   15   11
[2,]   20   10    6
3
Onyambu 4 czerwiec 2018, 08:35

Możemy użyć expand.grid, aby uzyskać wszystkie kombinacje wierszy i kolumn w b, a następnie użyj mapply, aby uzyskać odpowiedni wyjście z a za pomocą indeksowania. Używamy relist, aby wykonać matrycę d taka sama jak b.

df <- expand.grid(row = 1:nrow(b), col = 1:ncol(b))
d <- relist(mapply(function(x, y) a[x, y, b[x, y]], df$row, df$col), b)
d

#     [,1] [,2] [,3]
#[1,]    1   15   11
#[2,]   20   10    6

Gdzie df jest

   row col
#1   1   1
#2   2   1
#3   1   2
#4   2   2
#5   1   3
#6   2   3
1
Ronak Shah 4 czerwiec 2018, 07:22

Zaproponowałem również przy użyciu expand.grid, ale generuję matrycę indeksu do adresowania każdego wpisu a na raz.

ind <- as.matrix(expand.grid(1:nrow(b), 1:ncol(b)))
d <- matrix(a[cbind(ind, b[ind])], ncol = ncol(b), nrow = nrow(b))

Myślę, że jest to lekko bardziej wydajny

1
Tom 4 czerwiec 2018, 07:29