Я пытаюсь выбрать соответствующие строки из большого набора данных временных рядов.Сложность в том, что необходимые строки находятся до и после определенных значений в столбце.
# example data
x <- rnorm(100)
y <- rep(0,100)
y[c(13,44,80)] <- 1
y[c(20,34,92)] <- 2
df <- data.frame(x,y)
В этом случае критические значения 1 и 2 в столбце df$y
.Если, например, я хочу выбрать 2 строки до и 4 после df$y==1
, я могу сделать:
ones<-which(df$y==1)
selection <- NULL
for (i in ones) {
jj <- (i-2):(i+4)
selection <- c(selection,jj)
}
df$selection <- 0
df$selection[selection] <- 1
Это, возможно, плохо масштабируется для большего количества значений.Для df$y==2
мне пришлось бы повторить:
twos<-which(df$y==2)
selection <- NULL
for (i in twos) {
jj <- (i-2):(i+4)
selection <- c(selection,jj)
}
df$selection[selection] <- 2
Идеальным сценарием была бы функция, выполняющая что-то похожее на эту мнимую функцию selector(data=df$y, values=c(1,2), before=2, after=5, afterafter = FALSE, beforebefore=FALSE)
, где values
подается с критическими значениями before
с количеством строк для выбора до и соответственно after
.
Принимая во внимание, что afterafter
допускает возможность перехода от определенных строк до определенных строк после значения, например after=5,afterafter=10
(то же самое, но в другом направлении с afterafter
).
Любые советы и предложения приветствуются!Спасибо!