我没有在循环中显示为数字

时间:2015-08-22 16:21:02

标签: r for-loop

所以我有一个循环,找到矩阵中连续元素中存在最大差异的位置。例如,如果矩阵[8]和矩阵[9]在任何两个连续元素之间具有最大差异,则给出的数字应为8.

我以一种忽略比较的方式制作循环,其中一个元素是NaN(因为我的数据中有一些元素)。我制作的循环看起来像这样。

thenumber = 0 #will store the difference
for (i in 1:nrow(thematrix) - 1) {
  if (!is.na(thematrix[i]) & !is.na(thematrix[i + 1])) {
    if (abs(thematrix[i] - thematrix[i + 1]) > thenumber) {
      thenumber = i
    }
  }
}

看起来它应该可以工作,但每当我运行它

Error in if (!is.na(thematrix[i]) & !is.na(thematrix[i + 1])) { : 
  argument is of length zero

我尝试过这个东西,但在括号中使用随机数代替i而且它有效。出于某种原因,当我使用for循环开头指定的i时,它只能起作用。它没有认识到我代表一个数字。为什么不识别我?

另外,如果有更好的方法来完成这项任务,如果你能向我解释,我会非常感激

3 个答案:

答案 0 :(得分:2)

你非常接近但是当你打电话给i in 1:nrow(thematrix) - 1时,R会对此进行评估以使i = 0成为导致此问题的原因。我建议您致电i in 1:nrow(thematrix)i in 2:nrow(thematrix) - 1来开始i = 1的循环。我认为您的方法通常非常直观,但有一个建议是经常使用print()函数来评估i在函数过程中的变化情况。

答案 1 :(得分:2)

问题是:运算符的优先级高于-;你只需要在(nrow(thematrix)-1)周围使用括号。例如,

thematrix <- matrix(1:10, nrow = 5)
##
wrong <- 1:nrow(thematrix) - 1
right <- 1:(nrow(thematrix) - 1)
##
R> wrong
#[1] 0 1 2 3 4
R> right
#[1] 1 2 3 4

错误消息来自于尝试访问thematrix的第0个元素:

R> thematrix[0]
integer(0)

答案 2 :(得分:2)

另外两个答案直接解决了你的问题,但我必须说这是关于在R中解决这个问题的最坏方法。

set.seed(1)             # for reproducible example
x <- sample(1:10,10)    # numbers 1:10 in random order
x
# [1]  3  4  5  7  2  8  9  6 10  1
which.max(abs(diff(x))) 
# [1] 9

diff(...)函数计算顺序差异,which.max(...)标识向量中最大值的元素编号。