Подтвердить что ты не робот

Объединение матриц в массив из R

Если у меня есть несколько матриц, которые я создал, как я могу объединить их в один массив? У меня есть 8 матриц, каждая из которых имеет 200 строк и 200 столбцов, и мне нужно объединить их в массив с dim = 200 200,8. Поэтому я хочу, чтобы каждая из моих матриц была срезом моего массива.

4b9b3361

Ответ 1

вот пример для двоих. вы можете легко расширить это до восьми

# create two matricies with however many rows and columns
x <- matrix( 1:9 , 3 , 3 )
y <- matrix( 10:18 , 3 , 3 )
# look at your starting data
x
y

# store both inside an array, with the same first two dimensions,
# but now with a third dimension equal to the number of matricies
# that you are combining
z <- array( c( x , y ) , dim = c( 3 , 3 , 2 ) )

# result
z

Ответ 2

Вы можете использовать функцию abind из пакета abind:

library(abind)
newarray <- abind( mat1, mat2, mat3, mat4, along=3 )

## or if mats are in a list (a good idea)

newarray <- abind( matlist, along=3 )

Ответ 3

Здесь версия, аналогичная abind -ing, но без использования каких-либо дополнительных пакетов. Соберите все в list, а затем используйте sapply вариант simplify= в "array", не делая ничего для каждой части списка (identity просто возвращает объект и эквивалентен function(x) x):

sapply(list(x,y), identity, simplify="array")
# similarly to save a couple of keystrokes, the following is usually identical
sapply(list(x,y), I, simplify="array")

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

Если вы хотите сохранить имена каждой исходной матрицы в своем новом массиве в качестве идентификаторов, попробуйте:

sapply(mget(c("x","y")), identity, simplify="array")

Ответ 4

Это зависит от того, хотите ли вы объединить их в столбцы или строки. Это аналогично использованию cbind и rbind для объединения векторов в матрицу. Поскольку R хранит матрицы в порядке столбцов, это проще всего выполнить:

matrices <- list(
  matrix( 1:9 , 3 , 3 ),
  matrix( 10:18 , 3 , 3 )
);

#it is assumed all matrices in the list have equal dimensions
array1 <- array(
  data = do.call(cbind, matrices), 
  dim = c(dim(matrices[[1]]), length(matrices))
);

Новое измерение (в этом случае 2) станет 3-м измерением. Судя по выводам метода печати, это выглядит точным, поскольку он разбивает печать на последний размер:

> print(array1)
, , 1

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

, , 2

     [,1] [,2] [,3]
[1,]   10   13   16
[2,]   11   14   17
[3,]   12   15   18

Однако иногда вам может понадобиться комбинировать их по первому измерению, например:

array2 <- array (
  data = do.call(rbind, lapply(matrices, as.vector)), 
  dim = c(length(matrices), dim(matrices[[1]]))
);

print(array2[1,,])

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

Например, предположим, что вы хотите назначить эти матрицы кадру данных со столбцом; одна матрица для каждой строки. Тогда первые измерения, a.k.a nrow должны совпадать в массиве и кадре данных:

 mydf <- data.frame(foo = 1:2, row.names=c("first", "second"))
 mydf$bar <- array1
  Error in `$<-.data.frame`(`*tmp*`, "bar", value = 1:18) : 
    replacement has 3 rows, data has 2

 mydf$bar <- array2
 mydf$bar

Ответ 5

Как насчет этого:

combmat <- array(dim=c(200,200,8), data=cbind(matrix1,matrix2,...,matrix8) )

Ответ 6

Связано: Как складывать несколько матриц в R

Проблема со всеми решениями до сих пор заключается в том, что когда матрицы (не data.frame - для этого dplyr и data.table работают нормально) не имеют одинакового порядка строк и столбцов, привязка будет стекать значения друг над другом которые не связаны.

Если вы хотите проверить и принять во внимание имена в каждом измерении, посмотрите narray:

ввести описание изображения здесь

(отказ от ответственности: я написал пакет)

Ответ 7

library('abind')
abind(m1, m2, m3, along = 2.5)
abind(m1, m2, m3, along = 3)

m4 <- list(m1, m2, m3)
abind(m4, along = 3) 

       along        input = matrix + matrix                       output 
----------------------------------------------------------------------------
        0         split columns and row bind them                 array
        0.5       same as 0                                       array
        1         combine matrices into one matrix by rowwise     matrix
        1.5       split columns and column bind them              array
        2         combine matrices into one matrix by columnwise  matrix
        2.5       Form an array with matrices                     array
        3         Same as 2.5                                     array