Укороченная версия
Для каждого 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)?
Спасибо
Итак, чтобы было ясно, для этой выборки данных самый длинный ряд leaf_wetness_duration == 0 составляет 12 строк. 12 строк меньше 20 строк (= 5 часов * 15 минут / строка), поэтому вам нужен новый столбец, который соответствует FALSE для каждой строки в этом примере. Правильный?
@GregorThomas Меня интересует только событие распространения. Для spread_event 1 я хочу, чтобы это было правдой ТОЛЬКО, если есть непрерывный сухой период в течение 5 часов. Итак, если есть 2-часовой leaf_wetness_duration == 0, а затем 2-часовой влажный период leaf_wetness_duration > 0, я хочу, чтобы это было FALSE. Непрерывный или непрерывный - сложная часть здесь
Я не могу сказать, говорите ли вы мне, что мой предыдущий комментарий правильный или неправильный. Каков желаемый результат для ваших выборочных данных? Это новый столбец, в котором все FALSE?
@ГрегорТомас Да. Я хочу, чтобы новый столбец был FALSE, если нет 20 последовательных строк с leaf_wetness_duration == 0 в каждом spread_event. Количество 20 последовательных строк с leaf_wetness_duration == 0 в каждом spread_event также работает.
В моем ответе вы можете изменить на 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 часов.





Мы можем использовать функцию 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')
Учитывая ваш пример, каков ваш желаемый результат?