通过在 R 中将对角线元素添加为 1,从 n-1*n 矩阵创建 n*n 矩阵

Tri*_*dar 4 r matrix

例如我有一个 2*3 矩阵

     [,1] [,2] [,3]
[1,]    2    4    6
[2,]    3    5    7
Run Code Online (Sandbox Code Playgroud)

我想要一个 3*3 的矩阵,在 R 的对角线上插入 1 输出:

     [,1] [,2] [,3]
[1,]    1    4    6
[2,]    2    1    7
[3,]    3    5    1
Run Code Online (Sandbox Code Playgroud)

tmf*_*mnk 5

一种选择可能是:

mat_new <- `diag<-`(matrix(ncol = ncol(mat), nrow = nrow(mat) + 1, 0), 1)
mat_new[mat_new == 0] <- mat

     [,1] [,2] [,3]
[1,]    1    4    6
[2,]    2    1    7
[3,]    3    5    1
Run Code Online (Sandbox Code Playgroud)

或者原始想法的变体(由@Henrik 提出):

mat_new <- diag(ncol(mat))
mat_new[mat_new == 0] <- mat
Run Code Online (Sandbox Code Playgroud)

样本数据:

mat <- structure(2:7, .Dim = 2:3, .Dimnames = list(c("[1,]", "[2,]"), 
    NULL))
Run Code Online (Sandbox Code Playgroud)


jay*_*.sf 4

使用append

unname(mapply(function(x, y) append(x, 1, y), as.data.frame(m), 1:ncol(m) - 1))

#      [,1] [,2] [,3]
# [1,]    1    4    6
# [2,]    2    1    7
# [3,]    3    5    1
Run Code Online (Sandbox Code Playgroud)

或者使用replace.

replace(diag(3), diag(3) < 1, m)
#      [,1] [,2] [,3]
# [1,]    1    4    6
# [2,]    2    1    7
# [3,]    3    5    1
Run Code Online (Sandbox Code Playgroud)

数据:

m <- structure(2:7, .Dim = 2:3)
Run Code Online (Sandbox Code Playgroud)