Я думаю, что самым простым способом было бы прочитать все ваши значения в вектор. Вы можете сделать это, используя вариацию вашего существующего l oop.
Давайте предположим, что ваша матрица корреляции желаемого размера равна 5x5 (я знаю, что у вас есть 48x48, судя по вашему коду, но для простоты примера я буду работать с меньшей матрицей).
Пусть мы предполагаем, что вы прочитали все свои значения корреляции в вектор x
в главном порядке столбца (так же, как R использует), то есть первый элемент x
- строка 2 столбца 1, второй элемент - строка 3 столбца 1 и т. д. c. Кроме того, я предполагаю, что вы создаете симметричную корреляционную матрицу c, то есть у вас есть матрицы на диагонали, поэтому индексирование начинается так, как оно происходит, благодаря использованию функции diag()
. Давайте предположим, что ваш вектор x
содержит следующие значения:
x <- 1:10
Я знаю, что это не корреляции, но они позволят легко увидеть, как мы заполняем матрицу, т.е. какой элемент вектора входит в какой положение в результирующей матрице.
Теперь давайте создадим единичную матрицу и нулевые матрицы для верхней и нижней корреляций tri angular (вне диагонали).
# Assuming 5x5 matrix
n_elements <- 5
m <- diag(n_elements)
m_upper <- m_lower <- matrix(0, n_elements, n_elements)
Чтобы быстро заполнить нижнюю матрицу tri angular, мы можем использовать lower.tri()
.
m_lower[lower.tri(m_lower, diag = FALSE)] <- x
Это даст следующий результат:
[,1] [,2] [,3] [,4] [,5]
[1,] 0 0 0 0 0
[2,] 1 0 0 0 0
[3,] 2 5 0 0 0
[4,] 3 6 8 0 0
[5,] 4 7 9 10 0
Как видите, мы успешно заполнили нижнюю тройку angular. Также обратите внимание на порядок, в котором элементы вектора заполняются в матрице. Это важно для правильности ваших результатов. Верхний три angular - это просто транспонирование нижнего три angular, и затем мы можем сложить наши три матрицы вместе, чтобы сформировать вашу симметричную c матрицу корреляции.
m_upper <- t(m_lower)
M <- m_lower + m + m_upper
Что дает желаемый результат:
[,1] [,2] [,3] [,4] [,5]
[1,] 1 1 2 3 4
[2,] 1 1 5 6 7
[3,] 2 5 1 8 9
[4,] 3 6 8 1 10
[5,] 4 7 9 10 1
Как видите, нет необходимости работать с вложенными циклами для заполнения этих матриц. Единственное, что вам нужно * l oop, - это прочитать результаты из файлов (которые, похоже, у вас есть дескриптор) Если вам нужен только триангулированный выход, вы можете просто остановиться на нижней три angular матрице выше. Если ваш вектор оцененных корреляций (в моем примере x
) включает в себя диагональные элементы, просто установите diag = TRUE
в функции lower.tri()
, и вам подходит go.