我正在构建一些基于这篇有用的帖子。
我对数据集有三个相关问题df
:
machine ISOdatetime
1 M1 2013-08-21 18:16:39
2 M1 2013-08-21 18:20:44
3 M1 2013-08-21 18:21:42
4 M1 2013-08-21 18:46:09
5 M1 2013-08-21 18:46:27
6 M1 2013-08-21 19:01:13
etc
我想弄清楚半小时内出现了多少个值并放入一个新的数据帧中,如下所示:
machine ISOdatetime numberobs
1 M1 2013-08-21 18:30:00 3
2 M1 2013-08-21 19:00:00 2
3 M1 2013-08-21 19:30:00 1
etc
当然,以下代码对于整齐的每小时长度来说效果很好:
df2 <- data.frame(table(cut(df$ISOdatetime, breaks="hour")))
以下代码以 30 分钟为单位进行计数,但不会在每小时/半小时点整齐地开始(它从第一个列出的时间 18:16:39 开始,并指定开始时间为 18:16:00):
df2 <-data.frame(table(cut(df$ISOdatetime, breaks = "30 mins")))
问题 1. 什么可能是一个优雅的解决方案?我应该用类似的东西指定所需的间隔吗ints <-c("18:00", "18:30", "19:00" ...)
,还是没有必要?
问题2.我想当我到达原始数据帧的部分时我也会遇到麻烦df
具有“M2”值的df$machine
因为它也会计算这些。我最终会想单独绘制每台机器。也许使用subset
对于每台“机器”将是一种对数据进行分区的快速方法,但随后我将为每台“机器”得到一个数据框。不是问题,但是有没有一种优雅的方法可以将“machine”构建到上面的命令中?
问题 3. 在上一篇文章,它们的计数显示在“每小时的顶部”,这可能是每小时间隔的“结束时间”。但用他们提供的小数据集来检查这一点并不容易。根据我自己的数据,计数似乎已经结束。如果break=hour,我应该期望计数的目的是什么?
最近几个小时已经阅读和尝试了很多,但仍然卡住了,非常感谢帮助。
#
根据要求,我添加了更多信息。
我的实际数据
unit nightof time date isodatetime time2
1 7849 2013-08-21 18:16:39 2013-08-21 2013-08-21 18:16:39 2013-08-22 04:00:00
2 7849 2013-08-21 18:20:44 2013-08-21 2013-08-21 18:20:44 2013-08-22 04:00:00
3 7849 2013-08-21 18:21:42 2013-08-21 2013-08-21 18:21:42 2013-08-22 04:00:00
etc
406 7849 2013-08-21 04:06:10 2013-08-22 2013-08-22 04:06:10 2013-08-22 14:00:00
407 7849 2013-08-21 04:06:12 2013-08-22 2013-08-22 04:06:12 2013-08-22 14:00:00
408 7849 2013-08-21 04:06:28 2013-08-22 2013-08-22 04:06:28 2013-08-22 14:00:00
When I str()
'data.frame': 408 obs. of 6 variables:
$ unit: int 7849 7849 7849 7849 7849 7849 7849 7849 7849 7849 ...
$ nightof: Date, format: "2013-08-21" "2013-08-21" "2013-08-21" "2013-08-21" ...
$ time: List of 408
..$ : chr "18:16:39"
..$ : chr "18:20:44"
.. [list output truncated]
$ date: Date, format: "2013-08-21" "2013-08-21" "2013-08-21" "2013-08-21" ...
$ isodatetime: POSIXlt, format: "2013-08-21 18:16:39" "2013-08-21 18:20:44" "2013-08-21 18:21:42" "2013-08-21 18:21:48" ...
$ time2: POSIXct, format: "2013-08-22 04:00:00" "2013-08-22 04:00:00" "2013-08-22 04:00:00" "2013-08-22 04:00:00" ...
我使用的修改后的代码:
`mon$time2 <- with(mon, as.POSIXct(ceiling(as.numeric(isodatetime)/(30*60)) * (30*60), origin = "1970-01-01"))
with(mon, data.frame(table(time2)))
by(mon, mon$unit, function(x){data.frame(table(x$time2))})`
输出。
mon$unit: 7849
Var1 Freq
1 2013-08-22 04:00:00 27
2 2013-08-22 04:30:00 13
3 2013-08-22 05:00:00 16
4 2013-08-22 05:30:00 5
5 2013-08-22 06:00:00 8
6 2013-08-22 06:30:00 10
7 2013-08-22 07:00:00 25
8 2013-08-22 07:30:00 22
9 2013-08-22 08:00:00 61
10 2013-08-22 08:30:00 93
11 2013-08-22 09:00:00 54
12 2013-08-22 09:30:00 42
13 2013-08-22 10:00:00 11
14 2013-08-22 10:30:00 2
15 2013-08-22 11:00:00 2
16 2013-08-22 11:30:00 3
17 2013-08-22 12:00:00 2
18 2013-08-22 13:00:00 1
19 2013-08-22 14:00:00 11