我遇到的情况是我的程序正在通过数据框并找到符合特定条件的行。然后,它将信息子集化为单独的数据帧。我遇到的麻烦是,当使用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。谢谢。
答案 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