Создание матрицы из нескольких матриц, хранящихся в списке (r) - PullRequest
2 голосов
/ 14 апреля 2019

Редактировать: пример данных добавлен внизу.

Я хочу объединить несколько матриц, которые я сохранил в иерархическом списке.Иерархический список выглядит примерно так:

Bodies of Water - Sea   - Sea vs Sea   - DataFrame
                                       - Matrix

                        - Sea vs Lake  - DataFrame
                                       - Matrix

                        - Sea vs Pond  - DataFrame
                                       - Matrix

                 - Lake - Lake vs Sea  - DataFrame
                                       - Matrix

                        - Lake vs Lake - DataFrame
                                       - Matrix

                               ...


                        - Pond vs Pond - DataFrame
                                       - Matrix

В конечном итоге я хочу объединить матрицы таким образом, чтобы они выглядели так, чтобы имена представляли собой матрицу чисел, относящуюся к родительской папке, из которой они пришли,Я, конечно, не стремлюсь к буквальной таблице строк.

   Sea vs Sea   | Sea vs Lake  | Sea vs Pond
----------------|--------------|--------------
   Lake vs Sea  | Lake vs Lake | Lake vs Pond
----------------|--------------|--------------
   Pond vs Sea  | Pond vs Lake | Pond vs Pond

Однако я не знаю, как это сделать.Поскольку они в порядке, я подумал, что для начала лучше всего создать список или массив матриц:

AllMtx <- 'Bodies of Water'$[[i]]"[["Matrix"]]

или

AllMtx <- list.search('Bodies of Water'$[[i]], all(. == Matrix)

Ни один из которых даже близко не расположенк работе, чему не помогает тот факт, что я изо всех сил пытаюсь заставить list.search возвращать полные списки, а не просто сохранять каждое значение из объектов с именем "Matrix" в своем собственном элементе в новом списке.

А потом я подумал, что мог бы использовать этот список или массив или что-то еще, что я сделал, объединить команды rbind и cbind и получить окончательную матрицу, например,

cbind(
        (rbind(AllMtx, 1:3)),
        (rbind(AllMtx, 4:6)),
        (rbind(AllMtx, 7:9))
    )

Я надеялся, что это можетчто-то вроде разумного способа сборки матрицы, сначала скомбинировав '... vs Sea', '... vs Lake'... vs Pond' в строки, прежде чем, наконец, объединить их все вместе, чтобы уместить три столбца.

Конечно, я не наденуЯ не возражаю против того, как получить окончательную матрицу, но объяснение того, что я пытаюсь сделать, часто вызывает полезную обратную связь.

пример матриц:

list(AvsA = structure(c(1, 4, 5, 6, 1, 7, 4, 8, 1), .Dim = c(3L, 
3L)), AvsB = structure(c(3, 3, 4, 5, 5, 4, 3, 9, 2), .Dim = c(3L, 
3L)), BvsA = structure(c(2, 9, 3, 4, 5, 5, 4, 3, 3), .Dim = c(3L, 
3L)), BvsB = structure(c(1, 3, 4, 5, 1, 4, 3, 9, 1), .Dim = c(3L, 
3L)))


    "V1" "V2" "V3"          "V1" "V2" "V3"     
"1"  1    6    4        "1"  3    5    3    
"2"  4    1    8        "2"  3    5    9      
"3"  5    7    1        "3"  4    4    2      

    "V1" "V2" "V3"          "V1" "V2" "V3"
"1"  2    4    4        "1"  1    5    3
"2"  9    5    3        "2"  3    1    9
"3"  3    5    3        "3"  4    4    1

пример окончательной матрицы:

structure(c(1, 4, 5, 3, 3, 4, 6, 1, 7, 5, 5, 4, 4, 8, 1, 3, 9, 
2, 2, 9, 3, 1, 3, 4, 4, 5, 5, 5, 1, 4, 4, 3, 3, 3, 9, 1), .Dim = c(6L, 
6L))

    "V1" "V2" "V3" "V4" "V5" "V6"
"1"  1    6    4    2    4    4
"2"  4    1    8    9    5    3
"3"  5    7    1    3    5    3
"4"  3    5    3    1    5    3
"5"  3    5    9    3    1    9
"6"  4    4    2    4    4    1

Для того, чтобы получитьbove, комбинация rbind и cbind оказалась работоспособной.Однако я все еще изо всех сил пытаюсь объединить все мои маленькие «матричные» объекты в список.

1 Ответ

0 голосов
/ 14 апреля 2019

Это должно дать вам объект, чтобы затем применить правильные имена и названия к:

with(matL, rbind( cbind(AvsA, AvsB), cbind(BvsA,BvsB)))
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    6    4    3    5    3
[2,]    4    1    8    3    5    9
[3,]    5    7    1    4    4    2
[4,]    2    4    4    1    5    3
[5,]    9    5    3    3    1    9
[6,]    3    5    3    4    4    1

Если бы это была гораздо более крупная структура, то вам, возможно, понадобится сослаться на элементы списка с числовыми индексами, и в этом случае yoyu может использовать do.call с cbind и rbind:

with(matL, do.call( rbind, 
                     list( do.call( cbind, matL[1:2]), 
                           do.call( cbind, matL[3:4] ))
                  )
     )
 #------------------------
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    6    4    3    5    3
[2,]    4    1    8    3    5    9
[3,]    5    7    1    4    4    2
[4,]    2    4    4    1    5    3
[5,]    9    5    3    3    1    9
[6,]    3    5    3    4    4    1
...