如何逐行替换矩阵的非对角元素?

时间:2016-02-12 10:56:14

标签: r

我想用a替换矩阵的非对角元素 数字序列。 我设法写了这个:

mat[outer(1:nrows(mat), 1:nrows(mat), function(i,j) j!=i)] <- seq(1:182)

但它按列填充数字。我不想用 转置功能,因为我有特定的行名称,我想 保持。

示例

所以如果我有一个矩阵 m

m <- matrix(NA, nrow=5, ncol=5, dimnames=list(letters[1:5], NULL))
m
#   [,1] [,2] [,3] [,4] [,5]
# a   NA   NA   NA   NA   NA
# b   NA   NA   NA   NA   NA
# c   NA   NA   NA   NA   NA
# d   NA   NA   NA   NA   NA
# e   NA   NA   NA   NA   NA

如何在保持原始矩阵的rownames的同时将序列添加到非对角线:预期输出

#   [,1] [,2] [,3] [,4] [,5]
# a   NA    1    2    3    4
# b    5   NA    6    7    8
# c    9   10   NA   11   12
# d   13   14   15   NA   16
# e   17   18   19   20   NA

1 个答案:

答案 0 :(得分:3)

我们可以尝试

mat[lower.tri(mat, diag=FALSE)|upper.tri(mat, diag=FALSE)] <- 1:182

或者

mat[!diag(ncol(mat))] <- 1:182

在OP的帖子中使用一个小例子

m[!diag(ncol(m))] <- 1:20
out <- t(m)
dimnames(out) <- rev(dimnames(out))

来自@ user20650评论的rev