У меня есть такой пример:

dat=c(2,1,1,2,3,4,2,5,6,7,8,1,2,4,5,6,7,3,4,5,2,3,1,2,1)

Я хочу присвоить значения перед началом [после появления 3 последовательных значений со средним значением> 3] и после конца [определяется как появление 3 последовательных значений <3] в NA.

Ожидаемые результаты

dat=c(NA,NA,NA,NA,NA,4,2,5,6,7,8,1,2,4,5,6,7,3,4,5,2,3,NA,NA,NA)
r
-1
temor 25 Сен 2020 в 19:43

1 ответ

Лучший ответ

Используйте rollmean, чтобы найти средние значения трех периодов, и rollapply с all, чтобы найти последовательные значения, которые все <= 3.

library(zoo)

r1 <- rollmean(dat, 3, fill = NA, align = "left")
i1 <- which(r1 > 3)[1]

r2 <- rollapply(dat <= 3, 3, all, fill = NA, align = "left")
i2 <- tail(which(r2), 1)-1

replace(NA*dat, i1:i2, dat[i1:i2])
## [1] NA NA NA NA NA  4  2  5  6  7  8  1  2  4  5  6  7  3  4  5  2  3 NA NA NA
2
G. Grothendieck 25 Сен 2020 в 17:48