Muszę znaleźć, gdzie moje dane osiągają próg dla kolejnych dni. Szukam 4 kolejnych obserwacji powyżej progu. Chcę zwrócić lokalizację pierwszej obserwacji serii, która spełnia te kryteria.Lokalizacja i wartość dla kolejnych wartości powyżej progu
Oto dawać przykład dane:
eg = structure(list(t.date = structure(c(1L, 2L, 11L, 12L, 13L, 14L,
15L, 16L, 17L, 18L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L), .Label = c("4/30/11",
"5/1/11", "5/10/11", "5/11/11", "5/12/11", "5/13/11", "5/14/11",
"5/15/11", "5/16/11", "5/17/11", "5/2/11", "5/3/11", "5/4/11",
"5/5/11", "5/6/11", "5/7/11", "5/8/11", "5/9/11"), class = "factor"),
t.avg = c(4L, 4L, 5L, 6L, 10L, 18L, 18L, 18L, 18L, 12L, 10L,
10L, 8L, 8L, 9L, 10L, 6L, 5L)), .Names = c("date", "avg"
), row.names = c(NA, -18L), class = "data.frame")
Chcę datę gdzie Średnia spełnia kryteria (średnio> 17 przez 4 dni) Jedno podejście:
eg$date %in% eg$date[which(eg$avg > 17)]
# [1] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE FALSE FALSE
# [13] FALSE FALSE FALSE FALSE FALSE FALSE
w tym przypadku może odpowiedzieć jako pierwszy przypadek TRUE
, ale nie zadziała, jeśli drugi, trzeci lub czwarty nie będzie TRUE
Muszę pierwszą datę, gdzie warunek jest TRUE
:
eg$date[which(eg$avg > 17)]
# [1] 5/5/11 5/6/11 5/7/11 5/8/11
i położenie pierwszej obserwacji w serii:
which(eg$avg > 17)
# [1] 6 7 8 9
Znalazłem podobne pytania, ale nie byłem w stanie zginać metody do moich potrzeb.
Wielkie dzięki.
że nie powinno być 'rollmin' ... jeśli taka funkcja istnieje. lub może rollapply (..., min, 4) –
Dobry połów! Myliłem się z tym, że nazwa pola brzmi "avg" i po prostu kontynuuję to. Zmieniłem, aby odzwierciedlić Twój komentarz. – Jordan
'rollmax' istnieje:' which (-rollmax (-eg $ avg, 4)> 17) [1] ' –