Создайте новый столбец на основе условия в существующем столбце в R

Укороченная версия Для каждого spread_event мне нужно сделать новую колонку, основанную на существующей leaf_wetness_duration колонке, то есть ИСТИНА 5 часов или более 5 часов UNINTURRUPTED/CONTINUOUS наблюдается сухой период. Меня не интересует каждая строка, меня интересует spread_event.

Более длинная версия Я выставляю растения в поле на неделю или spread_event. Данные о погоде записывались с 15-минутным интервалом, поэтому каждая строка соответствует 15-минутной продолжительности. В столбце leaf_wetness_duration указана продолжительность влажности листьев, вызванная дождем или относительной влажностью. Я хочу проверить гипотезу о том, может ли спора выжить 5 часов или дольше UINTURRPED сухого периода или нет. Итак, если есть 1 час сухого периода и 1 час влажного периода, затем снова 1 час влажного/сухого периода и 5 часов или более сухого периода, я хочу, чтобы это было ЛОЖЬЮ, потому что меня интересует только непрерывный сухой период. Я могу рассчитать сухой период, но не знаю, как рассчитать UNINTERRUPTED/CONTINUOUS сухой период.

df %>%
group_by(spread_event) %>%
mutate (dry_period= ???) # spread event with continuous dry period of five hours or more
Spread_event        date            leaf_wetness_duration
1             8/19/15 7:15 PM                  15
1             8/19/15 7:30 PM                  2
1             8/19/15 7:45 PM                  0
1             8/19/15 8:00 PM                  0
1             8/19/15 8:15 PM                  0
1             8/19/15 8:30 PM                  0
1             8/19/15 8:45 PM                  0
1             8/19/15 9:00 PM                  0
1             8/19/15 9:15 PM                  0
1             8/19/15 9:30 PM                  0
1             8/19/15 9:45 PM                  0
1             8/19/15 10:00 PM                 0
1             8/19/15 10:15 PM                 0
1             8/19/15 10:30 PM                 0
1             8/19/15 10:45 PM                 3

В приведенном выше примере я могу сказать, что UNINTURREPTED продолжительность увлажнения листьев составляет 180 минут или 3 часа (12 рядов с нулевой влажностью - каждый ряд соответствует продолжительности 15 минут, 12 * 15 = 180 минут). Я хотел бы сделать это в R, а не вручную, потому что набор данных огромен. Есть ли способ, который может рассчитать leaf_wetness_duration == 0 для 20 рядов подряд (без влажного периода между leaf_wetness_duration == 0)?

Спасибо

Учитывая ваш пример, каков ваш желаемый результат?

Andre Wildberg 01.02.2023 22:41

Итак, чтобы было ясно, для этой выборки данных самый длинный ряд leaf_wetness_duration == 0 составляет 12 строк. 12 строк меньше 20 строк (= 5 часов * 15 минут / строка), поэтому вам нужен новый столбец, который соответствует FALSE для каждой строки в этом примере. Правильный?

Gregor Thomas 01.02.2023 22:42

@GregorThomas Меня интересует только событие распространения. Для spread_event 1 я хочу, чтобы это было правдой ТОЛЬКО, если есть непрерывный сухой период в течение 5 часов. Итак, если есть 2-часовой leaf_wetness_duration == 0, а затем 2-часовой влажный период leaf_wetness_duration > 0, я хочу, чтобы это было FALSE. Непрерывный или непрерывный - сложная часть здесь

Ahsk 02.02.2023 02:25

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

Gregor Thomas 02.02.2023 15:33

@ГрегорТомас Да. Я хочу, чтобы новый столбец был FALSE, если нет 20 последовательных строк с leaf_wetness_duration == 0 в каждом spread_event. Количество 20 последовательных строк с leaf_wetness_duration == 0 в каждом spread_event также работает.

Ahsk 02.02.2023 15:48

В моем ответе вы можете изменить на mutate(longest_run_of_0 = with(rle(leaf_wetness_duration), max(lengths[values == 0])), чтобы получить самый длинный пробег 0 с, затем вы можете делать любые условия, которые хотите... например, longest_run_of_0 > 3 * 4 & longest_run_of_0 <= 5 * 4 в течение 3-5 часов.

Gregor Thomas 04.02.2023 19:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мы можем использовать функцию rle, чтобы найти самую длинную последовательную серию нулей.

library(dplyr)
df %>%
  group_by(Spread_event) %>%
  mutate(
    longest_run_of_0 = with(rle(leaf_wetness_duration), max(lengths[values == 0]) >= 20)
  ) %>%
  ungroup()

# # A tibble: 15 × 4
#    Spread_event date             leaf_wetness_duration longest_run_of_0
#           <int> <chr>                            <int> <lgl>           
#  1            1 8/19/15 7:15 PM                     15 FALSE           
#  2            1 8/19/15 7:30 PM                      2 FALSE           
#  3            1 8/19/15 7:45 PM                      0 FALSE           
#  4            1 8/19/15 8:00 PM                      0 FALSE           
#  5            1 8/19/15 8:15 PM                      0 FALSE           
#  6            1 8/19/15 8:30 PM                      0 FALSE           
#  7            1 8/19/15 8:45 PM                      0 FALSE           
#  8            1 8/19/15 9:00 PM                      0 FALSE           
#  9            1 8/19/15 9:15 PM                      0 FALSE           
# 10            1 8/19/15 9:30 PM                      0 FALSE           
# 11            1 8/19/15 9:45 PM                      0 FALSE           
# 12            1 8/19/15 10:00 PM                     0 FALSE           
# 13            1 8/19/15 10:15 PM                     0 FALSE           
# 14            1 8/19/15 10:30 PM                     0 FALSE           
# 15            1 8/19/15 10:45 PM                     3 FALSE  

Если вы хотите вместо этого подсчитать количество таких запусков, вы можете использовать count = with(rle(leaf_wetness_duration), sum(lengths[values == 0] >= 20))


Используя этот образец данных

df = read.table(header = T, text = 'Spread_event        date            leaf_wetness_duration
1             "8/19/15 7:15 PM"                  15
1             "8/19/15 7:30 PM"                  2
1             "8/19/15 7:45 PM"                  0
1             "8/19/15 8:00 PM"                  0
1             "8/19/15 8:15 PM"                  0
1             "8/19/15 8:30 PM"                  0
1             "8/19/15 8:45 PM"                  0
1             "8/19/15 9:00 PM"                  0
1             "8/19/15 9:15 PM"                  0
1             "8/19/15 9:30 PM"                  0
1             "8/19/15 9:45 PM"                  0
1             "8/19/15 10:00 PM"                 0
1             "8/19/15 10:15 PM"                 0
1             "8/19/15 10:30 PM"                 0
1             "8/19/15 10:45 PM"                 3')

Другие вопросы по теме