Я запускаю два вложенных цикла для проверки на каждую строку вектора, если любой из десяти строк ниже - 3 балла больше трех строк ниже. Если true, a 1 записывается во вновь созданный двоичный вектор. (Звучит сложно, я знаю, но сравнения такого рода позволяют проверить условия в временных рядах для торговых целей)Фильтрация значений NA, когда петля выходит за пределы вектора (определение границ цикла)
Например, для строки один, хотят проверить:
- строка 2> строки 5 + 3 ИЛИ
строка 3> строка 6 + 3 ИЛИ
...
строка 11> строка 14 + 3
(BTW мне нужны петли, идея заключается в том, чтобы запустить это на тысячи строк, а не только 20)
Следующий код работает хорошо, но имеет нежелательную характеристику получения значения NA, когда один из цикла идет вне вектора.
df <- data.frame( LastPrice = c(1221, 1220, 1230, 1217, 1216, 1218 , 1216, 1216, 1217, 1220, 1219, 1218, 1220, 1216, 1217, 1218, 1218, 1207, 1206, 1205))
df$StrongMoveBinary[j] <- 0
for(j in 1:20) {
tmp <- 0
for (i in 1:10) {
tmp <- tmp + ifelse (df$LastPrice[j+i] - df$LastPrice[j+i+3] > 3, 1, 0)}
df$StrongMoveBinary[j] <- tmp>0}
//Note: purpose of tmp variable is to record every occasion that LastPrice > LastPrice 3 rows below, rather than just the last instance
Этот код создает StrongMoveBinary = 1 1 0 0 1 1 1 NA NA NA NA NA NA NA NA NA NA NA NA NA. Это 13 НС. Но есть достаточно данных, чтобы иметь только 4 НС. Остальные 9 НС являются результатом плохого кодирования с моей стороны. Чтобы обойти проблему, я модифицировал код, чтобы ограничить значения «i» заданными значениями «j», и, следовательно, остановить цикл «i» за пределами вектора.
df$StrongMoveBinary[j] <- 0
for(j in 1:20) {
x <- 0
if (j <= 10) {x=10}
if (j > 10) {x=20-j}
tmp <- 0
for (i in 1:x) {
tmp <- tmp + ifelse (df$LastPrice[j+i] - df$LastPrice[j+i+3] > 3, 1, 0)}
df$StrongMoveBinary[j] <- tmp>0}
К сожалению, он не работает. У StrongMoveBinary все еще есть 13 НС. Любые идеи были бы высоко оценены! Спасибо.
Так что, когда вы говорите «любой из 10 строки ниже ", это больше похоже на" * любой из десяти строк ниже (меньше, если их недостаточно) .... * «Правильно? Таким образом, к тому времени, когда мы перейдем к строке 16, вы проверите, есть ли строка 17> строка 20, а для строки 17 «NA» - правильный ответ, да? – Gregor
Точно! Вот что я пробовал в модифицированном коде. Для строки 18 NA - правильный ответ. Строка 17 все еще может быть рассчитана. – Krug
Как рассчитывается строка 17? В вашем примере «** Для строки 1 **» сравнения идут из строки 2> строка 5 в строку 11> строка 14. По этой логике «** Для строки 17 **» мы добавляем 16 ко всем этим числа и получить из строки 18> строка 21 *, которая не существует * - даже не первое сравнение. Исправьте либо пример, либо комментарий. – Gregor