Функция/цикл R: когда числовая переменная опускается ниже значения (например, 40), сколько времени требуется, чтобы вернуться выше 40?

#r

Вопрос:

Я пытаюсь создать воспроизводимую/автоматизированную функцию в R, которая фиксирует «скорость восстановления» определенной числовой переменной. Эта переменная «SNR_kHz» варьируется от -17 до 77 кГц, но также имеет категорически связанную переменную под названием «SNRLevel» с уровнями «Низкий SNR», «Средний SNR» и «Высокий SNR», которые я создал. «Низкий SNR» — это то же самое, что и значения «SNR_kHz» ниже 40. Мои данные представляют собой смесь числовых, данных о дате и времени и категориальных данных с большим количеством NA из-за того, как данные были изначально собраны и объединены, и состоят в общей сложности из ~3000 наблюдений, из которых только ~300 совпадают. Я уже загрузил данные как можно больше и удалил NA, где это уместно. Одно важное замечание заключается в том, что есть два микрофонных канала, которые сообщают мне, что такое SNR_kHz («F. SNRChannel» 1 и 2), и эти два канала всегда будут иметь разные записи с частотой кГц. Канал 1 показал самые низкие значения кГц, в то время как канал 2 кажется более стабильным. Я хотел бы рассматривать эти два канала как единое целое, если это возможно, поскольку они физически расположены рядом друг с другом и поскольку большинство расхождений может быть вызвано неисправностями, в отличие от фактических записей с разными кГц. Например, если «F. SNRChannel 1» падает ниже 40 кГц, я хочу, чтобы цикл начинался, даже если «F. SNRChannel 2» имеет значение кГц около 70. Ниже приведено изображение «примера» моего набора данных, а внизу этого поста-вывод dput() первых 30 строк моего набора данных.

Вот изображение набора данных и его заголовков

В то время как SNR-кГц падает ниже 40 кГц, я хочу получить данные об относительной влажности и температуре (столбцы»Humidmean» и «Tempmean») и дате и времени (столбец»в корзине»). Моя колонка даты и времени имеет формат «2020-08-01 00:06:00». Я хочу «разорвать» цикл, когда SNR_kHz вернется выше 40, и снова отметить дату, время, влажность и температуру. Как правило, когда SNR_khz падает ниже 40, требуется много часов или даже дней, чтобы снова подняться выше 40. Я пытаюсь найти среднее «время», необходимое для этого восстановления, а также определить относительную влажность и температуру, когда происходит восстановление. Затем я, вероятно, хотел бы взять среднее значение этих относительных влажности и температуры для всех циклов, чтобы определить, сколько времени требуется для восстановления значений SNR_khz для этого конкретного набора данных и сайта.

Я поиграл с функциями «для», «повтор», «в то время как», «печать», «для», «перерыв» и создания новых переменных внутри цикла для определения даты и времени, когда значения SNR опускаются ниже 40 (например, «начало»), и что такое дата и время, когда значения SNR снова превышают 40 (например,» конец»), чтобы использовать» difftime(конец-начало) » в качестве функции внутри цикла безрезультатно. Вот пример кода, который я пробовал:

 repeat{    if(example$SNRLevel=="Low SNR")  startlt;-print(example$binned)  print(example$Humidmean)    if(example$SNRLevel!="Low SNR")  {  break  endlt;-print(example$binned)  }  print(difftime(start-end, tz="America/Chicago", units="hours"))  }  

Вот вывод dput() моего набора данных:

 gt;dput(example[495:535, ]) structure(list(binned = structure(c(1597578360, 1597578360, 1597579560,  1597622760, 1597623960, 1597623960, 1597625160, 1597626360, 1597627560,  1597628760, 1597629960, 1597631160, 1597632360, 1597633560, 1597634760,  1597635960, 1597637160, 1597638360, 1597639560, 1597640760, 1597641960,  1597643160, 1597644360, 1597645560, 1597646760, 1597647960, 1597649160,  1597650360, 1597651560, 1597652760, 1597653960, 1597655160, 1597656360,  1597657560, 1597658760, 1597659960, 1597661160, 1597662360, 1597663560,  1597664760, 1597664760), tzone = "America/Chicago", class = c("POSIXct",  "POSIXt")), precipsum = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0), Humidmean = c(64.3, 64.3, 66, 48.8,  53.1, 53.1, 54.05, 51.4, 55.1, 59.85, 59.6, 57.7, 56.85, 58.8,  59, 59.2, 57.8, 59.1, 59.45, 62.2, 63.5, 65, 66, 67.6, 67.75,  70.2, 70.9, 71.8, 74.6, 74.1, 76.5, 74.1, 77, 76.3, 78.3, 81.7,  90.95, 100, 100, 100, 100), Pressmean = c(980.35, 980.35, 980.5,  978.6, 978.7, 978.7, 978.6, 978.7, 978.5, 978.6, 978.6, 978.7,  978.55, 978.6, 978.7, 978.55, 978.6, 978.7, 978.85, 978.8, 979,  979.2, 979, 979, 979.2, 979.2, 979.1, 979.05, 979.2, 979.2, 978.75,  978.5, 978.4, 978.15, 978.1, 977.9, 977.7, 977.8, 977.6, 977.95,  977.95), Tempmean = c(21.6, 21.6, 21.6, 28.5, 27.9, 27.9, 27.5,  27.5, 27.3, 26.75, 26.5, 26.4, 26.35, 26, 25.7, 25.45, 25.8,  24.9, 24.7, 24.4, 24.3, 23.9, 23.6, 23.3, 23.3, 23.1, 23, 22.85,  22.3, 22.5, 21.9, 22.2, 21.7, 22.05, 22, 21.3, 20.45, 19.7, 19.3,  19.05, 19.05), F.SNRChannel = structure(c(1L, 2L, NA, NA, 1L,  2L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,  NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,  NA, NA, 1L, 2L), .Label = c("Channel 1", "Channel 2"), class = "factor"),   SNR_40kHz = c(2, 65, NA, NA, 0, 65, NA, NA, NA, NA, NA, NA,   NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,   NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 73, 63),   HumidLevel = c("Avg Humid", "Avg Humid", "Avg Humid", "Low Humid",   "Avg Humid", "Avg Humid", "Avg Humid", "Avg Humid", "Avg Humid",   "Avg Humid", "Avg Humid", "Avg Humid", "Avg Humid", "Avg Humid",   "Avg Humid", "Avg Humid", "Avg Humid", "Avg Humid", "Avg Humid",   "Avg Humid", "Avg Humid", "Avg Humid", "Avg Humid", "Avg Humid",   "Avg Humid", "Avg Humid", "Avg Humid", "Avg Humid", "Avg Humid",   "Avg Humid", "Avg Humid", "Avg Humid", "Avg Humid", "Avg Humid",   "Avg Humid", "High Humid", "High Humid", "High Humid", "High Humid",   "High Humid", "High Humid"), SNRLevel = c("Low SNR", "Avg SNR",   NA, NA, "Low SNR", "Avg SNR", NA, NA, NA, NA, NA, NA, NA,   NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,   NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "High SNR", "Avg SNR"  ), RainPresence = c("No rain", "No rain", "No rain", "No rain",   "No rain", "No rain", "No rain", "No rain", "No rain", "No rain",   "No rain", "No rain", "No rain", "No rain", "No rain", "No rain",   "No rain", "No rain", "No rain", "No rain", "No rain", "No rain",   "No rain", "No rain", "No rain", "No rain", "No rain", "No rain",   "No rain", "No rain", "No rain", "No rain", "No rain", "No rain",   "No rain", "No rain", "No rain", "No rain", "No rain", "No rain",   "No rain")), row.names = c(NA, -41L), groups = structure(list(  binned = structure(c(1597578360, 1597579560, 1597622760,   1597623960, 1597625160, 1597626360, 1597627560, 1597628760,   1597629960, 1597631160, 1597632360, 1597633560, 1597634760,   1597635960, 1597637160, 1597638360, 1597639560, 1597640760,   1597641960, 1597643160, 1597644360, 1597645560, 1597646760,   1597647960, 1597649160, 1597650360, 1597651560, 1597652760,   1597653960, 1597655160, 1597656360, 1597657560, 1597658760,   1597659960, 1597661160, 1597662360, 1597663560, 1597664760  ), tzone = "America/Chicago", class = c("POSIXct", "POSIXt"  )), .rows = structure(list(1:2, 3L, 4L, 5:6, 7L, 8L, 9L,   10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L,   21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L,   32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40:41), ptype = integer(0), class = c("vctrs_list_of",   "vctrs_vctr", "list"))), row.names = c(NA, -38L), class = c("tbl_df",  "tbl", "data.frame"), .drop = TRUE), class = c("grouped_df",  "tbl_df", "tbl", "data.frame"))  

Комментарии:

1. Вы хотите знать дату, когда время SNRLevel начинает равняться "Low SNR" и когда оно выходит из этого состояния, затем вычислить время различия, а затем вычислить среднее время различия?

2. Более или менее, да. Мне не обязательно нужно находить среднее время в цикле, но я скорее могу вычислить это снаружи в отдельных вычислениях. Я ищу функцию «в стиле модели», которую я могу в конечном итоге предсказать или ожидать увидеть в будущих наборах данных. Например, может потребоваться в среднем 5 дней, чтобы уровень SNR снова стал нормальным (мы используем 40 в качестве минимального порога чувствительности микрофона, а все, что ниже 40, считается очень плохими показаниями микрофона), и исследователи хотели бы знать, какова была относительная влажность и температура, которые совпали с этим «окном восстановления».