Как сохранить элемент векторов в определенной позиции матриц - PullRequest
0 голосов
/ 16 ноября 2018

Проблема:

У меня есть список векторов одинаковой длины. Я хотел бы преобразовать эти векторы в нижние треугольные матрицы. Однако каждый элемент каждого вектора займет определенную позицию в этих матрицах.

Обратите внимание, что моя исходная матрица очень сложна и основана на цикле for. Следовательно, мне нужно решить эту проблему, чтобы использовать for цикл.

Пример:

Предположим, что у меня есть список X с 10 векторами, т.е.

X <- list(x1=c(1:3), x2=(2:4), x3=c(4:2), x4=c(5:7), x5=c(12,34,54), 
          x6=c(3:5), x7=c(2:4), x8=c(3,4,5), x9=c(44,56,7), x10=c(34,5,4)) 

Каждый вектор содержит 3 элементов. Затем мне нужно присвоить число этим векторам x=c(1:10). 1 относится к x1, 2 к x2 и так далее.

Затем мне нужно преобразовать x в нижнюю треугольную матрицу, т.е.

x <- c(1:10)
M <- matrix(0,5,5)
M[lower.tri(M, diag=FALSE)] <- x

M
     [,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

4, 7, 9 и все другие записи M называются позициями каждого вектора X. Например, 4 относится к x4, 7 относится к x7, а 9 относится к x9 и т. Д. Для других векторов. Следовательно, позиция x4 - это все 4 в [5,1] в M.

Сейчас:

  • Мне нужно хранить элемент каждого вектора в позиции его вектора в M. Другими словами, каждый элемент каждого вектора сохраняется на основе номера вектора этого элемента. Например, 54 принадлежит вектору 5, следовательно, его позиция равна 5.

Например, элементом вектора x4 являются 5, 6, and 7. Затем мне нужно хранить их в трех разных нижних треугольных матрицах, каждый элемент на своей позиции, т.е.

> X_new[[1]]
     [,1] [,2] [,3] [,4] [,5]
[1,]  0.0    0    0    0    0
[2,]  0      0    0    0    0
[3,]  0.0    0    0    0    0
[4,]  0.0    0    0    0    0
[5,]  5      0    0    0    0


X_new[[2]]
     [,1] [,2] [,3] [,4] [,5]
[1,] 0.00    0    0    0    0
[2,] 0       0    0    0    0
[3,] 0.00    0    0    0    0
[4,] 0.00    0    0    0    0
[5,] 6       0    0    0    0
> 



X_new[[3]]
     [,1] [,2] [,3] [,4] [,5]
[1,] 0.00    0    0    0    0
[2,] 0       0    0    0    0
[3,] 0.00    0    0    0    0
[4,] 0.00    0    0    0    0
[5,] 7       0    0    0    0

Следовательно, элементы вектора x4 занимают одинаковое положение 4 в нижней треугольной матрице M. То же самое для всех других векторов.

Для этого я должен использовать for loop (как моя оригинальная функция использует для loop).

k = 5, 4, 3, 2 количество строк. Затем i= 4, 3, 2, 1 весь каждый ряд.

for(k in 5:2){ 
    for(i in 1:(k-1)){ 
        X_new[k,i] <- X[[i]]
    }
}

Есть идеи, как это сделать, пожалуйста?

1 Ответ

0 голосов
/ 16 ноября 2018

Мы можем сделать это с lapply

lapply(X[4:6], function(x) {
         M <- matrix(0, 5, 5)
         M[lower.tri(M, diag = TRUE)] <- x
     M
    })

Если нам нужен цикл for,

for(i in 4:6) {
    tmp <- matrix(0, 5, 5)
    tmp[lower.tri(tmp, diag = TRUE)] <- x
    X[[i]] <- tmp
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...