[英]for loop to find position where the sum of the actual value and the next one is greater than x
我想創建一個迭代向量的 for 循環。 在本例中,一旦找到 position 和下一個 position 的實際值之和高於 100,它應該打印索引號並中斷。
我使用以下示例向量
v <- sample(1:100, 100, replace = TRUE);
到目前為止,我創建了
for (index in 1:length(v)){
if (sum(v[index]+v[index+1]) > 100){
print(sprintf("found in %s", v[index]));
}
if (sum(v[index]+v[index+1]) > 101) break
};
考慮到我正在尋找一個 position 加上下一個的值,如何確保在打印第一個 position 后循環中斷(我是在第一個還是之后的一個中斷,因為它也應該被考慮? )
任何輸入表示贊賞!
幾點評論:
如果要將x
和y
相加,可以使用x + y
或sum(x, y)
。 如果x
和y
是向量,它們是不同的(試試看。)。 但是如果x
和y
都是單個值(長度為 1),它們是相同的。 sum(v[index]+v[index+1])
似乎是多余的 - 保持簡單並使用其中一個。
如何確保在打印找到的第一個 position 后循環中斷?
在print()
之后立即break
。
...考慮到我正在尋找一個 position 加上下一個的價值
這就是你的if()
語句所做的。 因為您同時使用v[index]
和v[index + 1]
,所以您已經在考慮兩者。
如果您到達循環的最后一次迭代,其中index = length(v)
,則v[index + 1]
將給出越界錯誤。 所以你應該只循環到倒數第二個元素。
歡迎來到不需要分號的 R!
因此,清理后的 for 循環可能如下所示:
for (index in 1:(length(v) - 1)){
if (v[index] + v[index + 1] > 100){
print(sprintf("found in %s", v[index]))
break
}
}
您可以在沒有for
循環的情況下執行此操作:
v <- c(23, 45, 67, 33, 45)
which.max(head(v, -1) + tail(v, -1) > 100)
#[1] 2
這將返回總和大於 100 的對的第一個索引。
上述變化如下:
which.max(v[-1] + v[-length(v)] > 100)
which.max(v + dplyr::lead(v) > 100)
which.max(v + data.table::shift(v, type = 'lead') > 100)
which.max(v + dplyr::lag(v) > 100) - 1
which.max(v + data.table::shift(v) > 100) - 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.