计算一组时间间隔R中常规时间跨度的发生次数

时间:2015-02-02 23:47:29

标签: r summary posixct

给出如下数据集。我想计算一天中特定小时(00:00,01:00,......,22:00,23:00)完全落在任何给定间隔内的次数。

发生日期并不重要。只是总数。

### This code is to create a data set similar to the one I am using. 

### This is a function I found on here to generate random times
latemail <- function(N, st="2012/01/01", et="2012/12/31") {
  st <- as.POSIXct(as.Date(st))
   et <- as.POSIXct(as.Date(et))
   dt <- as.numeric(difftime(et,st,unit="sec"))
   ev <- sort(runif(N, 0, dt))
   rt <- st + ev
}

set.seed(123)
startTimes <- latemail(5)
  endTimes <- startTimes +18000

my_data <- data.frame(startTimes, endTimes)

> my_data
                start                 end
1 2012-04-14 16:10:44 2012-04-14 21:10:44
2 2012-05-28 23:38:16 2012-05-29 04:38:16
3 2012-10-14 10:33:10 2012-10-14 15:33:10
4 2012-11-17 23:13:56 2012-11-18 04:13:56
5 2012-12-08 22:29:36 2012-12-09 03:29:36

这样有希望帮助您了解我正在使用的内容。

理想情况下,输出将是一个数据集,其中包含一个小时变量,另一个变量用于出现次数。喜欢这个

   hour count
1 00:00     3
2 01:00     3
3   etc     ?

如何以不同的增量(比如15分钟)这样做也很有用。

谢谢!

1 个答案:

答案 0 :(得分:0)

这是我的尝试。我相信有更好的方法可以做到这一点。鉴于上述评论,我做了以下几点。首先,我使用hour获取ifelse。正如您在评论中所描述的那样,我在这里向上/向下舍入hour。使用transmute,我希望得到一个包含小时数的字符串。在某些情况下,开始时间可能大于结束时间(在这种情况下,记录跨越日期)。为了解决这个问题,我使用了setdiff()c()toString()。使用单独的I分隔小时进入列。我想使用cSplit()包中的splitstackshape,但我收到了一条错误消息。因此,我在这里选择了separate()。在我将所有小时分开后,我使用gather()重新整理数据,最后使用hour计算count()filter()被用来移除NA病例。我希望这会在某种程度上帮助你。

** Data ** 

structure(list(startTimes = structure(c(1328621832.79254, 1339672345.94964, 
1343434566.9641, 1346743867.55964, 1355550696.37895), class = c("POSIXct", 
"POSIXt")), endTimes = structure(c(1328639832.79254, 1339690345.94964, 
1343452566.9641, 1346761867.55964, 1355568696.37895), class = c("POSIXct", 
"POSIXt"))), .Names = c("startTimes", "endTimes"), row.names = c(NA, 
-5L), class = "data.frame")

#           startTimes            endTimes
#1 2012-02-07 22:37:12 2012-02-08 03:37:12
#2 2012-06-14 20:12:25 2012-06-15 01:12:25
#3 2012-07-28 09:16:06 2012-07-28 14:16:06
#4 2012-09-04 16:31:07 2012-09-04 21:31:07
#5 2012-12-15 14:51:36 2012-12-15 19:51:36

library(dplyr)
library(tidyr)

mutate(my_data, start = ifelse(as.numeric(format(startTimes, "%M")) >= 0 & as.numeric(format(startTimes, "%S")) > 0,
                               as.numeric(format(startTimes, "%H")) + 1,
                               as.numeric(format(startTimes, "%H"))),
                end = ifelse(as.numeric(format(endTimes, "%M")) >= 0 & as.numeric(format(endTimes, "%S")) > 0,
                             as.numeric(format(endTimes, "%H")) - 1,
                             as.numeric(format(endTimes, "%H"))),
                start = replace(start, which(start == "24"), 0),
                end = replace(end, which(end == "-1"), 23)) %>%
rowwise() %>%
transmute(hour = ifelse(start < end, toString(seq.int(start, end, by = 1)),
                        toString(c(setdiff(seq(0, 23, by = 1), seq.int(end, start, by = 1)),
                                    start, end)))) %>%
separate(hour, paste("hour", 1:24, sep = "."), ", ", extra = "merge") %>%
gather(foo, hour) %>%
count(hour) %>%
filter(complete.cases(hour))

#   hour n
#1     0 2
#2     1 1
#3    10 1
#4    11 1
#5    12 1
#6    13 1
#7    15 1
#8    16 1
#9    17 2
#10   18 2
#11   19 1
#12    2 1
#13   20 1
#14   21 1
#15   22 1
#16   23 2