【问题标题】:How to replace non diagonal elements of matrix by row?如何逐行替换矩阵的非对角元素?
【发布时间】:2016-02-12 10:56:14
【问题描述】:

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

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

如何在保留原始矩阵的行名的同时向非对角线添加序列:预期输出

#   [,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

【问题讨论】:

  • @akrun 你能帮我吗?
  • t 选项更直接,你不能只重命名行名(如果我理解正确的话)
  • 它暗淡的名字,我喜欢保留,可以吗?
  • 可以使用dimnames(m1)&lt;-更改dimnames
  • Akrun 可能有一个更简洁的方法,但这应该可行...m[row(m) != col(m)] &lt;- 1:20 ; out &lt;- t(m); dimnames(out) &lt;- rev(dimnames(out))(向以前的 cmets 致敬)

标签: r


【解决方案1】:

我们可以试试

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 的cmets 的rev

【讨论】:

  • 谢谢,但它的工作原理与我的代码相同。我需要按行而不是按列填充数字。
  • @RobM 你没有提供一个小例子或预期的输出。
  • @RobM t(mat) 给出了准确的输出。
  • "我不想使用转置函数,因为我有特定的行名,我想保留。"
  • @Pascal 喘口气。我可能会也可能不会删除它。你可以做你幼稚的活动。
猜你喜欢
  • 1970-01-01
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
相关资源
最近更新 更多