У меня есть вектор, где важен порядок элементов, например:
v<-c(1,2,3,4,5,6,7,8,9,10)
Я хотел бы расположить свой вектор в нижней/верхней треугольной матрице с определенным порядком:
1 2 4 7
0 3 5 8
0 0 6 9
0 0 0 10
или
1 0 0 0
2 3 0 0
4 5 6 0
7 8 9 10
Я думаю, что могу сделать это с помощью for, но я не знаю, как, а пробелы можно заполнить NA или 0.
Спасибо
Вы можете заполнить верхнюю треугольную матрицу, выполнив
mat <- matrix(0, nrow = 4, ncol = 4)
mat[upper.tri(mat, diag = TRUE)] <- v
mat
# [,1] [,2] [,3] [,4]
#[1,] 1 2 4 7
#[2,] 0 3 5 8
#[3,] 0 0 6 9
#[4,] 0 0 0 10
Нижний треугольник не следует той же последовательности, что и верхний треугольник, поэтому
mat[lower.tri(mat, diag = TRUE)] <- v
не дает ожидаемого результата.
Мы можем получить индексы нижнего треугольника, order
их в соответствии со строкой, а затем обновить матрицу
order_mat <- which(lower.tri(mat, diag = TRUE), arr.ind = TRUE)
mat[order_mat[order(order_mat[, 1]), ]] <- v
mat
# [,1] [,2] [,3] [,4]
#[1,] 1 0 0 0
#[2,] 2 3 0 0
#[3,] 4 5 6 0
#[4,] 7 8 9 10
Или, как прокомментировал @Gregor, гораздо более простой способ - перенести верхний треугольный результат
mat <- matrix(0, nrow = 4, ncol = 4)
mat[upper.tri(mat, diag = TRUE)] <- v #Upper triangle
t(mat) #Lower triangle