R и Excel - Рассчитать среднее значение списка часов - PullRequest
0 голосов
/ 23 марта 2019

У меня есть список часов, и я хочу рассчитать среднее. Список выглядит так:

mydata
       dawn  dusk
1      7:12 19:14
2      7:10 19:15
3      7:09 19:16
4      7:07 19:17
5      7:06 19:18
6      7:04 19:19
7      7:02 19:20
8      7:01 19:21

Я пробовал в R, но я не мог найти способ вычислить среднее значение, потому что объект не числовой или логический. Я могу рассчитать среднее значение, как это

mean(as.numeric(mydata$dusk)

но я не могу понять результат (57.5). Я пытался в Excel, но он не работает. Если я попробую на небольшом примере, как это (mydata) работает, но набор данных имеет 500 строк, и Excel показывает странный результат (например: в списке времени рассвета, все они более или менее в период между 05:00 утра и 08:00 00:00, результат 18:30. Та же проблема для сумеречных времен). Я не знаю, зависит ли проблема Excel от часового пояса, поэтому я хотел бы решить в R. Любое предложение? С Уважением, * Lisa * 1007

Ответы [ 2 ]

1 голос
/ 23 марта 2019

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

mydata$dusk <- paste0(as.character(mydata$dusk), ":00")

Используя chron::times

mean(chron::times(mydata$dusk))
[1] 19:17:30

или как показано ниже

format(mean(strptime(mydata$dusk, "%H:%M:%S")), "%H:%M:%S")
[1] 19:17:30
0 голосов
/ 23 марта 2019

Вы также можете рассмотреть возможность использования пакета lubridate.Функция hm может обрабатывать формат часы: минуты.period_to_seconds и seconds_to_period могут правильно обрабатывать временной класс.

library(tidyverse)
library(lubridate)


mydata2 <- mydata %>% 
  mutate_all(list(~hm(.))) %>%
  summarize_all(list(~seconds_to_period(mean(period_to_seconds(.)))))
mydata2
#          dawn        dusk
# 1 7H 6M 22.5S 19H 17M 30S

DATA

mydata <- read.table(text = "       dawn  dusk
1      '7:12' '19:14'
                     2      '7:10' '19:15'
                     3      '7:09' '19:16'
                     4      '7:07' '19:17'
                     5      '7:06' '19:18'
                     6      '7:04' '19:19'
                     7      '7:02' '19:20'
                     8      '7:01' '19:21'",
                     header = TRUE, stringsAsFactors = FALSE)
...