【问题标题】:R number of items to replace is not a multiple of replacement length / results however correctR 要替换的项目数不是替换长度/结果的倍数,但是正确
【发布时间】:2025-05-13 06:35:02
【问题描述】:

我知道已经有一些关于这方面的线索,但是通过那些我无法弄清楚问题可能是什么 - 请原谅我......

我正在尝试运行代码

  for (i in 1:a){
    matrix$new_column[i]<-which(matrix[i,1:b-1]==matrix$col_b[i])
  }

我正在尝试的是: 对于a行和b列的矩阵,在每一行的2b列中-1,找到与列b中的值相同的那一列(总是有这样的值)并将对应的列号写入*new_column*

我的代码一直报错

matrix$new_column[i]

但是,结果是完全正确的。我试过了

  • 首先创建用 0 填充的 *new_column*
  • 将结束索引从 a 更改为 a-1a+1

如前所述,结果是正确的,但是我觉得如果我做的一切都正确,我不应该收到警告信息,所以我非常感谢任何关于如何解决这个问题的建议。

最后,不要问我为什么要从 2 转到 b-1 时选择 1:b-1,我只是看到当我使用 2:b-1 时,它实际上会从列开始3..

【问题讨论】:

  • 这不是错误,而是警告。
  • 是的,对不起,我的错。不过,如果我做得正确,它不应该发出警告吗?
  • 这意味着你的新向量的长度与产生它的长度不同。因此,即使结果看起来正确,也可能有些地方不正确。

标签: r for-loop warnings


【解决方案1】:

which() 可以在有多个匹配项时返回一个向量。例如:

which((1:12)%%2 == 0) # which are even?

matrix$col_b[i] 是唯一的吗?结果可能看起来仍然正确。注意在这种情况下会发生什么:

x <- 1:2
x[1] <- 3:4
x

另外,1:b-1 不会给你从1b - 1 的数字,而是从1b 的数字,都减去1

b <- 10
1:b-1

你需要括号来强制减法:1:(b - 1)

【讨论】:

  • 好的,我没有预见到我可能有两个相等的值。修复它并且错误消失了 - 谢谢!至于缺少的括号,也谢谢你:)
【解决方案2】:

如果您想创建五个 Y 向量,请尝试此操作。

set.seed(101)
    lambda_j <- rgamma(1000,1,1)

    Y <- matrix(NA, nrow=1000, ncol=5)
for (j in 1:ncol(Y)) {
  for(i in 1:nrow(Y)) {
    Y[,j] <- rpois(1000,lambda_j)
  }
}

【讨论】: