Эффективная переменная группы, на которую нужно обратить внимание, когда значения падают в два раза - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть набор данных, который содержит метки времени начала и окончания, а также процент производительности. Я хотел бы рассчитать групповую статистику по часовым блокам, например, «средняя производительность за полночный час составила х%».

Мой вопрос: есть ли более эффективный способ сделать это, чем серия ifelse? ().

# some sample data
pre.starting <- data.frame(starting = format(seq.POSIXt(from = 
as.POSIXct(Sys.Date()), to = as.POSIXct(Sys.Date()+1), by = "5 min"),
              "%H:%M", tz="GMT"))

pre.ending <- data.frame(ending = pre.starting[seq(1, nrow(pre.starting), 
2), ])
ending2 <- pre.ending[-c(1), ]
starting2 <- data.frame(pre.starting = pre.starting[!(pre.starting$starting 
%in% pre.ending$ending),])

dataset <- data.frame(starting = starting2
                    , ending = ending2
                    , perct = rnorm(nrow(starting2), 0.5, 0.2))

Например, я мог бы создать часовые блоки с кодом в следующих строках:

dataset2 <- dataset %>% 
  mutate(hour = ifelse(starting >= 00:00 & ending < 01:00, 12
         , ifelse(starting >= 01:00 & ending < 02:00, 1
         , ifelse(starting >= 02:00 & ending < 03:00, 13)))
         ) %>% 
  group_by(hour) %>% 
  summarise(mean.perct = mean(perct, na.rm=T))

Есть ли способ сделать этот код более эффективным,или улучшить за ifelse ()?

1 Ответ

0 голосов
/ 30 сентября 2019

Мы можем использовать cut ending час на основе часового интервала после преобразования временных меток в POSIXct, а затем принимать mean за каждый час.

library(dplyr)

dataset %>%
  mutate_at(vars(pre.starting, ending), as.POSIXct, format = "%H:%M") %>%
  group_by(ending_hour = cut(ending, breaks = "1 hour")) %>%
  summarise(mean.perct = mean(perct, na.rm = TRUE))


#   ending_hour         mean.perct
#   <fct>                    <dbl>
# 1 2019-09-30 00:00:00      0.540
# 2 2019-09-30 01:00:00      0.450
# 3 2019-09-30 02:00:00      0.612
# 4 2019-09-30 03:00:00      0.470
# 5 2019-09-30 04:00:00      0.564
# 6 2019-09-30 05:00:00      0.437
# 7 2019-09-30 06:00:00      0.413
# 8 2019-09-30 07:00:00      0.397
# 9 2019-09-30 08:00:00      0.492
#10 2019-09-30 09:00:00      0.613
# … with 14 more rows
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...