Как выбрать определенное количество строк до и после предопределенных значений - PullRequest
1 голос
/ 06 апреля 2019

Я пытаюсь выбрать соответствующие строки из большого набора данных временных рядов.Сложность в том, что необходимые строки находятся до и после определенных значений в столбце.

# 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).

Любые советы и предложения приветствуются!Спасибо!

1 Ответ

1 голос
/ 06 апреля 2019

Это достаточно просто с rep и каждым его аргументом.

df$y[rep(which(df$y == 2), each=7L) + -2:4] <- 2

Здесь rep повторяет строковые индексы, которые ваш критерий 7 раз каждый (два до, значение и четыре после, L указывает, что аргумент должен быть целым числом). Добавьте значения от -2 до 4, чтобы получить эти индексы. Теперь замени.

Обратите внимание, что для некоторых сравнений == не будет адекватным из-за точности чисел. См. Сообщение SO , почему эти цифры не равны для подробного обсуждения этой темы. В этих случаях вы можете использовать что-то вроде

which(abs(df$y - 2) < 0.001)

или любой другой прецизионный метод будет работать для вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...