Преобразование вектора в R в нижнюю / верхнюю треугольную матрицу в определенном порядке

У меня есть вектор, в котором важен порядок элементов, например:

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

or

1 0 0 0
2 3 0 0
4 5 6 0
7 8 9 10

Я думаю, что смогу сделать это с помощью for, но я не знаю, как, и пробелы могут быть заполнены NA или 0

Благодарность


person Beth    schedule 31.05.2019    source источник


Ответы (1)


Вы можете заполнить верхнюю треугольную матрицу, выполнив

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
person Ronak Shah    schedule 31.05.2019