在R中创建一个不连续的For循环

时间:2014-01-26 04:28:46

标签: r for-loop

我遇到的情况是我的程序正在通过数据框并找到符合特定条件的行。然后,它将信息子集化为单独的数据帧。我遇到的麻烦是,当使用for循环时,我得到重叠的数据。

例如,如果第一行符合我的条目条件而第四行符合退出条件,我也不需要它也说第2行符合条目的条件。我想循环重新开始第5行。

以下是一个例子:

Ratio
0.87
0.88
0.86
0.90
0.92
0.93

假设标准是找到比率小于0.9的第一个数据点,然后找到大于或等于0.9的下一个点。在这种情况下,我想要第1行作为条目,第4行作为退出。我不希望循环检查第2行。下一步是检查第5行及以后的第一个数据点低于0.9。一旦找到一个,它就会找到数据点大于或等于0.9的下一行。

我现在正以复杂的方式做这件事,导致其他问题,而且只是马虎。

for (i in 1:length(data$Ratio))
  {
    while (!i==1 && data$Date[i] <= ExitDate )
    {i = i+1}
...

这成功地增加了我,但这又是草率的。我确信在R中有一种方法可以以更干净的方式实现这一点,甚至可能没有for循环。

感谢您的帮助。

我根据Jake的建议实施了解决方案:

for (i in 1:length(data$Ratio))
  { 

    if(data$Ratio[i] < ShortExit && data$Ratio[i-1] >= ShortExit
       || i==1 && data$Ratio[i] < ShortExit )

...

我更喜欢使用循环结构而不是修改数据,但是,我能够通过使用Jake的检查当前数据点和前一个数据点的想法摆脱while循环。 ShortExit是我询问的阈值。在我给出的例子中它是0.9。谢谢。

1 个答案:

答案 0 :(得分:1)

data$lag_Ratio <- c(NA, head(data$Ratio, -1))

entries <- data$Ratio < 0.9 & data$lag_Ratio >= 0.9 | is.na(data$lag_Ratio)
## [1]  TRUE FALSE FALSE FALSE FALSE FALSE

exits <- data$Ratio >= 0.9 & data$lag_Ratio < 0.9
## [1] FALSE FALSE FALSE  TRUE FALSE FALSE