Извлечение строк для первого вхождения переменной до наступления события - PullRequest
0 голосов
/ 03 сентября 2018

Попытка извлечь первое вхождение переменной во фрейме данных до определенного значения, уже выбранного во фрейме данных. В частности, вывод head(df):

date discharge     event event.isolation some.column
1/1/2016  7.782711         NA  NA             FALSE
1/2/2016  7.349389  -5.567748  none            TRUE
1/3/2016  7.053813  -4.021769  none            TRUE
1/4/2016  7.421568   5.213554  none            TRUE
1/5/2016  5.722443 -22.894418  none            TRUE
1/6/2016  5.497342  -3.933662  none            TRUE
1/7/2016  5.347890  -6.898281  none            TRUE
1/8/2016  7.983489   4.289382  none            TRUE
1/9/2016  8.488293  -19.28304  none            TRUE

Я бы хотел найти date первого discharge значения 7,7 или выше перед каждым event из -22 или меньше. Другими словами, я знаю каждый event, представляющий интерес; Я хотел бы выполнить итеративный поиск в обратном направлении, чтобы найти первое discharge значение 7,7 или более перед каждым выбранным event.

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

Желаемый результат будет df[1, ], поскольку он содержит первое значение discharge (работающее в обратном направлении), которое превышает 7,7, до event в строке 5, которую я выбрал.

1 Ответ

0 голосов
/ 03 сентября 2018

Это не самое элегантное решение, но оно работает для примера.

Сначала определяются интервалы просмотра (один интервал для каждого event < -22). Затем ищет первое вхождение discharge > 7.7

В этом примере я предполагаю, что вы не хотите находить строки, где event < -22 И discharge > 7.7, даже если это будет первый случай discharge > 7.7 с момента последнего события

df <- read.csv(text = 'date discharge     event event.isolation some.column
1 1/1/2016  7.782711         NA  <NA>           FALSE
 2 1/2/2016  7.349389  -5.567748  none            TRUE
 3 1/3/2016  7.053813  -4.021769  none            TRUE
 4 1/4/2016  7.421568   5.213554  none            TRUE
 5 1/5/2016  5.722443 -22.894418  none            TRUE
 6 1/6/2016  5.497342  -3.933662  none            TRUE
 7 1/7/2016  5.347890  -6.898281  none            TRUE
 8 1/8/2016  7.983489   4.289382  none            TRUE',sep="")

## look which rows have a value for event < 22 and also include row 0 to define the first interval to look
 d <- c(0,which(df$event < -22))

## Each interval is defined as d[i] to d[i+1], where intervals are skipped where these are equal (because then you would return rows where both event < -22 and discharge > 7.7
new.df <- NULL
 for(i in 1:(length(d)-1)) {
  if(d[i+1] > (d[i] + 1)) {
   ## this will look only in the interval and return the first row for which the condition discharge>7.7 is TRUE
   new.df <- subset(df[(d[i]+1):(d[i+1]-1),], discharge>7.7)[1,]
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...