所以我有一个循环,找到矩阵中连续元素中存在最大差异的位置。例如,如果矩阵[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时,它只能起作用。它没有认识到我代表一个数字。为什么不识别我?
另外,如果有更好的方法来完成这项任务,如果你能向我解释,我会非常感激
答案 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(...)
标识向量中最大值的元素编号。