簡體   English   中英

for 循環查找 position 實際值與下一個值之和大於 x

[英]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 后循環中斷(我是在第一個還是之后的一個中斷,因為它也應該被考慮? )

任何輸入表示贊賞!

幾點評論:

  • 如果要將xy相加,可以使用x + ysum(x, y) 如果xy是向量,它們是不同的(試試看。)。 但是如果xy都是單個值(長度為 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM