a vector to an upper Triangle matrix by row in R

2019-02-16 18:54发布

问题:

I have a vector say

a = c(1,2,3,4,5,6) 

I would like to organize them into the elements into an upper triangle matrix (without considering diagonal elements, they are all zero) by row. My goal is to get the following matrix:

     [,1] [,2] [,3] [,4]
[1,]    0    1    2    3
[2,]    0    0    4    5
[3,]    0    0    0    6
[4,]    0    0    0    0

But the following way I do it is to replace the diagonal elements with this vector but assign values by column. For example,

b= matrix(0, 4, 4)
b[upper.tri(b, diag=FALSE)]=a 

it will give me the following matrix

   [,1] [,2] [,3] [,4]
[1,]    0    1    2    4
[2,]    0    0    3    5
[3,]    0    0    0    6
[4,]    0    0    0    0

The reason is that when R assign values to a matrix, by default, it will assign them by column. I am wondering if there is a simple way to solve my problem without writing a for loop.

I found a similar post before related to my problem but it does not explain assign values to a upper triangle matrix by row:

creating a triangular matrix

Thanks in advance!

回答1:

Here's one option

b[lower.tri(b, diag=FALSE)] <- a
b <- t(b)
b
#      [,1] [,2] [,3] [,4]
# [1,]    0    1    2    3
# [2,]    0    0    4    5
# [3,]    0    0    0    6
# [4,]    0    0    0    0

Alternatively, reorder a as required and assign that into the upper-right triangle:

ut <- upper.tri(b, diag=FALSE)
b[ut] <- a[order(row(ut)[ut], col(ut)[ut])]
b
     [,1] [,2] [,3] [,4]
[1,]    0    1    2    3
[2,]    0    0    4    5
[3,]    0    0    0    6
[4,]    0    0    0    0


回答2:

Note that to fill an ASYMMETRIC matrix you could first fill the upper triangle via the code shown above, then the lower with a DIFFERENT vector (no transpose needed).

  c <- c(7,8,9,10,11,12)
  b[lower.tri(b, diag=FALSE)] <- c


标签: r matrix vector