У меня есть таблица данных (DT) с годом, датой и измерением температуры (TMEAN):Заменить условные операторы
YEAR DATE TMEAN
2010 2010-01-01 -5
2010 2010-01-02 -9
2010 2010-01-03 -6
2010 2010-01-04 0.1
2010 2010-01-05 -0.5
2010 2010-01-06 1
2010 2010-01-07 1.6
2010 2010-01-08 8
2010 2010-01-09 6
2010 2010-01-10 3
2010 2010-01-11 5
2010 2010-01-12 3
2011 2011-01-01 -3
2011 2011-01-02 -5.4
2011 2011-01-03 -3.6
2011 2011-01-04 0.06
2011 2011-01-05 -0.3
2011 2011-01-06 0.6
2011 2011-01-07 0.96
2011 2011-01-08 4.8
2011 2011-01-09 3.6
2011 2011-01-10 1.8
2011 2011-01-11 3
2011 2011-01-12 1.8
За каждый год, мне нужно, чтобы получить первый день, когда измерение является положительным для на не менее 5 дней подряд ...
идея была бы:
for (y in min(DT$YEAR):max(DT$YEAR)) {
for (i in 1:nrow(DT)) {
DT$test <- ifelse(DT[i, TMEAN] > 0 & DT[i+1, TMEAN] > 0 & DT[i+2, TMEAN] > 0 & DT[i+3, TMEAN] > 0 & DT[i+4, TMEAN] > 0, 1, 0)
}
}
DT2 <- DT[test == 1, ][, list(START = min(DATE)), by = .(YEAR)]
но это супер медленно (и не очень элегантно!).
Как я могу заменить множественное использование for и ifelse?
Просьба воспроизводимый пример 'DT '. – Roland
Просто быстро скажите, что вы должны начать с написания «DT $ test <- ifelse (DT [i, TMEAN]> 0 & DT [i + 1, TMEAN]> 0 & DT [i + 2, TMEAN] > 0 & DT [i + 3, TMEAN]> 0 & DT [i + 4, TMEAN]> 0, 1, 0) 'как функция, а затем используйте' lapply'. Затем вместо использования внешнего 'for' попробуйте просто сделать истинное/ложное значение для условия, а затем включить его в вашу функцию. В общем, избавиться от циклов, где бы вы ни находились, и использовать векторизацию. – Elin
спасибо за подсказку ...Я пытаюсь перейти к таким направлениям, чтобы повысить эффективность работы с R (а также бинарный поиск с помощью data.table) – user2165907