Если у меня есть несколько матриц, которые я создал, как я могу объединить их в один массив? У меня есть 8 матриц, каждая из которых имеет 200 строк и 200 столбцов, и мне нужно объединить их в массив с dim = 200 200,8. Поэтому я хочу, чтобы каждая из моих матриц была срезом моего массива.
Объединение матриц в массив из R
Ответ 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