#r #tidyverse #posixct #psych
Вопрос:
Я ищу, чтобы создать простую пользовательскую функцию, которую я могу интегрировать в рабочий процесс канала dplyr.
Я хочу рассчитать среднее значение времени без учета дат. Так, например, учитывая последовательность POSIXct, я хочу извлечь время и рассчитать среднее значение. Однако одно дополнительное осложнение заключается в том, что время является круговым, а это означает, что 00:00:00 и 23:00:00 очень близки друг к другу во времени, но арифметически не так близки. Поэтому я не могу просто использовать что — то вроде mean(time_vector)
вычисления среднего значения.
Я видел пакет psych, в котором есть функция, вызываемая circadian.mean
для вычисления кругового среднего. Однако это занимает всего несколько часов, так что мне пришлось немного подтасоваться, прежде чем получить действительный вывод. Например:
library(tidyverse) library(lubridate) library(psych) df = data.frame(datetime = as.POSIXct(c("2019-07-14 23:00:17", "2019-07-14 23:40:20", "2019-07-14 00:12:45", "2019-07-14 00:17:19"), tz = "UTC")) decimal_hours_vector = df %gt;% mutate(hours = hour(datetime)) %gt;% # extracting hours mutate(minutes = minute(datetime)) %gt;% # extracting minutes mutate(seconds = second(datetime)) %gt;% # extracting seconds mutate(dec_min = (minutes/60*100)/100) %gt;% # converting minutes to decimal hour mutate(dec_sec = (seconds/60/60*100)/100) %gt;% # converting seconds to decimal hour rowwise() %gt;% mutate(dec_hour = sum(hours,dec_min,dec_sec)) %gt;% # summing all three time columns rowwise ungroup() %gt;% # ungrouping pull(dec_hour) # extracting dec_hour as vector to use in circadian.mean # calculating average time with psych average_time = circadian.mean(decimal_hours_vector)
Итак, я думаю, что вышесказанное работает, но очень громоздко. Кроме того, я до сих пор не понял, имеет ли смысл конвертировать конечный результат обратно в hh:mm:ss или он должен оставаться в десятичном формате и все ли работает так, как должно.
В отличие от использования описанного выше трудоемкого процесса, есть ли лучший или более разумный способ сделать это?
Комментарии:
1. Похоже, вам может понадобиться рассчитать остатки десятичного времени по модулю после деления на 12 или 24 часа, но я не могу сказать, какое правило вам на самом деле нужно. Укажите еще несколько примеров. Объекты POSIXct на самом деле уже являются десятичными числами под их атрибутами класса. Я думаю, вам нужно сказать, каков правильный ответ для большего набора примеров.
2. ммм….. Честно говоря, я очень смущен. Я могу привести общий пример, возможно, это помогло бы? Допустим, меня интересует среднее время входа в магазин, люди заходят с 9 утра до 5 вечера в любое время. В конечном счете мне нужно удобное время, которое, я могу сказать, является моим пиковым временем потока. Это игнорирование дней, просто интересуют часы, минуты и секунды.
3. Если вы ограничиваете домен менее чем на 8 часов, я не думаю, что вам нужно завязывать себя в узлы.
4. Да, возможно, это был глупый пример. Фактический набор данных имеет время в течение 8 месяцев в течение 24 часов.
5. Тогда вам нужно сказать, каков на самом деле правильный ответ. Ваши консультанты не могут сказать, что это такое. Если бы 24 раза были равномерно распределены в течение 24 часов, каково было бы «среднее значение»? 12 часов дня? Возможно, вам захочется изучить «циклическую статистику». Есть пакет с именем … подождите его … «круговой».