给出如下数据集。我想计算一天中特定小时(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分钟)这样做也很有用。
谢谢!
答案 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