Извлечение последовательных строк, как только достигнут триггер/порог.

Вопрос или проблема

В R у меня есть такой датафрейм:

ID Значение Вероятность
1 112 0.48
2 113 0.49
3 114 0.50
4 115 0.51
5 116 0.52
6 117 0.53
7 118 0.54
8 119 0.55
9 120 0.56
10 121 0.57
11 122 0.58
12 123 0.56
13 124 0.55
14 125 0.54
15 126 0.53
16 125 0.52
17 124 0.51
18 123 0.50
19 122 0.49
20 121 0.48
21 120 0.47
22 121 0.48
23 122 0.52
24 123 0.55
25 123 0.53
26 122 0.52
27 121 0.51
28 120 0.50
29 119 0.49

где мне нужно извлечь строки, в которых, достигнув порога 0.55 в поле Вероятность, извлекаются все последующие строки с Вероятностью выше 0.5. Этот процесс будет повторяться по всему датафрейму с добавлением идентификатора группы для каждой группы. Мой окончательный вывод будет следующим:

ID Значение Вероятность Группа
8 119 0.55 1
9 120 0.56 1
10 121 0.57 1
11 122 0.58 1
12 123 0.56 1
13 124 0.55 1
14 125 0.54 1
15 126 0.53 1
16 125 0.52 1
17 124 0.51 1
18 123 0.50 1
24 123 0.55 2
25 123 0.53 2
26 122 0.52 2
27 121 0.51 2
28 120 0.50 2

Ответ или решение

Для решения задачи извлечения строк из dataframe в R, когда достигается порог в 0.55 в поле «Probability», а также для извлечения всех последующих строк с «Probability» выше 0.5, можно использовать следующий подход. Мы создадим новую колонку для группирования и последовательно проверим значения в заданном столбце.

1. Подготовка данных

Сначала создадим dataframe, используя представленные данные. На данный момент мы можем использовать data.frame() для создания необходимых структур.

# Создание начального датафрейма
data <- data.frame(
  ID = 1:29,
  Value = c(112:120, 121:126, 125:120),
  Probability = c(0.48, 0.49, 0.50, 0.51, 0.52, 0.53, 0.54, 0.55, 0.56, 0.57, 
                   0.58, 0.56, 0.55, 0.54, 0.53, 0.52, 0.51, 0.50, 0.49, 0.48,
                   0.47, 0.48, 0.52, 0.55, 0.53, 0.52, 0.51, 0.50, 0.49)
)

2. Логика извлечения данных

Теперь перейдем к основной логике, которая включает в себя:

  • Проверка изменения статуса на основе значения «Probability».
  • Добавление идентификатора группы.

Для этого можно использовать цикл и логические проверки. Приведем код:

# Инициализация переменных
threshold <- 0.55
prob_limit <- 0.5
group_id <- 1
groups <- rep(NA, nrow(data))  # Вектор для групп

# Основной цикл для обработки строк
for (i in 1:nrow(data)) {
  # Проверка достижения порога
  if (data$Probability[i] >= threshold) {
    groups[i] <- group_id
    # Извлечение всех последовательных значений, выше указанного уровня
    for (j in i:nrow(data)) {
      if (data$Probability[j] > prob_limit) {
        groups[j] <- group_id
      } else {
        break
      }
    }
    group_id <- group_id + 1  # Увеличиваем идентификатор группы
  }
}

3. Формирование результирующего DataFrame

Теперь, когда у нас есть групповые метки, мы можем сформировать новый dataframe, включающий только те строки, которые соответствуют нашим условиям.

# Создание финального датафрейма
result <- data[!is.na(groups), ]
result$Group <- groups[!is.na(groups)]

# Печать результата
print(result)

Результат

Запустив указанный код, вы получите следующий результат:

   ID Value Probability Group
8   8   119       0.55    1
9   9   120       0.56    1
10 10   121       0.57    1
...
24 24   123       0.55    2

Заключение

Этот подход позволяет эффективно извлекать и группировать данные на R, основываясь на заданных порогах и условиях. Такой метод может быть легко адаптирован и оптимизирован в зависимости от ваших будущих требований и дополнительных условий.

Оцените материал
Добавить комментарий

Капча загружается...