【问题标题】:R: conditional matrix filling with for loops through rows and column indicesR:用for循环填充行和列索引的条件矩阵
【发布时间】:2018-03-08 15:30:02
【问题描述】:

我是 R 初学者,我知道这是非常基本的,很抱歉,但我无法通过遵循文档和类似线程找到自己的方法。

我正在尝试使用条件语句填充一个空矩阵mat2,并循环遍历另一个相同维度的数据帧的行和列ixj我用作参考矩阵,称为mat。在这个例子中,mat 也是我对mat2 的值的“来源”,但这在我的实际问题中并不完全正确,也与解决这个问题无关。我一直在努力让它像这样工作......

mat

 1  -2   3
 2  -4   6
 3  -6   9
-4   8  -12


mat2 = matrix(0L, nrow = nrow(mat), ncol = ncol(mat))

for (i in nrow(mat)) {
  for (j in ncol(mat)){
    if (mat[i,j] >= 0) {
      mat2[i,j] = 0
      }
    else {
      mat2[i,j] = mat[i,j]
    }
  }
}

...导致...

mat2

0   0   0
0   0   0
0   0   0
0   0  -12

...不是我想要的。

我对我的 for 循环和条件单元格赋值的语法更感兴趣,除了这只是虚拟代码:我不需要替换 mat 中的值,而是创建一个新矩阵并用值填充它遵循特定的条件和方程式。

尽管如此,我不知道我做错了什么,任何帮助将不胜感激。

【问题讨论】:

  • 输出应该是什么?
  • 你的循环的问题只是你只迭代一个值。试试for (i in 1:nrow(mat)) 而不是for (i in nrow(mat))
  • 是的,@AndrewGustar 是正确的,循环被破坏了,但是在 R 中,你不需要在循环中创建那个尴尬的循环只是为了对矩阵进行操作,因为矩阵只是具有维度属性的向量。
  • @AndrewGustar 我怎么会错过这个?
  • 请问您为什么在 2 个循环中使用这种“索引和替换”结构?通常,当您发现自己在 R 中编写这样的循环时,您应该考虑是否存在解决问题的矢量化方法。

标签: r for-loop


【解决方案1】:

忘记所有循环:

mat <- c(1,  -2,   3,
         2,  -4,   6,
         3,  -6,   9,
         -4,   8,  -12)
dim(mat) <- c(4, 3)

mat2 <- mat
mat2[mat2 >= 0] <- 0

【讨论】:

  • 这不是我想要的,对不起,我认为我的问题已经足够清楚了
【解决方案2】:

正如 AndrewGustar 在对原始帖子的评论中指出的那样,我的循环语法中有一个相当愚蠢的错误。我纠正了它,它可以工作,正确的语法是

for (i in 1:nrow(mat)) {
  for (j in 1:ncol(mat)){

而不是

for (i in nrow(mat)) {
  for (j in ncol(mat)){

这导致我的代码仅在行和列的最后一对索引值上“循环”,即(nrow(mat), ncol(mat))(4, 3)

正确的输出是

mat2

    0   -2    0
    0   -4    0
    0   -6    0
   -4    0  -12 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 2021-09-29
    • 2012-10-28
    • 1970-01-01
    相关资源
    最近更新 更多