子集第一次为两小时的时间间隔

时间:2014-04-03 11:08:12

标签: r datetime subset group-by

我在子集时间方面遇到问题。 1)我想按时间间隔过滤我的数据,其中一个在午夜,另一个在中午。 2)我只需要第一次在每个间隔发生。

数据框看起来像这样

             DATE v
1  2007-07-28 00:41:00 1
2  2007-07-28 02:00:12 5
3  2007-07-28 02:01:19 3
4  2007-07-28 02:44:08 2
5  2007-07-28 04:02:18 3
6  2007-07-28 09:59:16 4
7  2007-07-28 11:21:32 8
8  2007-07-28 11:58:40 5
9  2007-07-28 13:20:52 4
10 2007-07-28 13:21:52 9
11 2007-07-28 14:41:32 3
12 2007-07-28 15:19:00 9
13 2007-07-29 01:01:48 2
14 2007-07-29 01:41:08 5

结果应如下所示

             DATE v
2  2007-07-28 02:00:12 5
9  2007-07-28 13:20:52 4
13 2007-07-29 01:01:48 2

可重复的代码

DATE<-c("2007-07-28 00:41:00", "2007-07-28 02:00:12","2007-07-28    02:01:19", "2007-07-28 02:44:08", "2007-07-28 04:02:18","2007-07-28 09:59:16", "2007-07-28 11:21:32", "2007-07-28 11:58:40","2007-07-28 13:20:52", "2007-07-28 13:21:52", "2007-07-28 14:41:32","2007-07-28 15:19:00", "2007-07-29 01:01:48", "2007-07-29 01:41:08")

v<-c(1,5,3,2,3,4,8,5,4,9,3,9,2,5)

hyljes<-data.frame(cbind(DATE,v))

df <-subset(hyljes, format(as.POSIXct(DATE),"%H") %in% c ("01":"02","13":"14"))

制作间隔有问题。它允许我将小时数“13”:“14”,但不是“01”:“02”。那有什么合理的答案吗? 我还没有找到如何从每个区间中获得第一个元素的方法。

感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

尝试

hyljes[c(1, head(cumsum(rle(as.POSIXlt(hyljes$DATE)$hour < 13)$lengths) + 1, -1)), ]
##                   DATE v
## 1  2007-07-28 00:41:00 1
## 9  2007-07-28 13:20:52 4
## 13 2007-07-29 01:01:48 2
  • as.POSIXlt(hyljes$DATE)$hour < 13为您提供时间是在中午之前还是之后
  • rle(...)$lengths为您提供TRUE和FALSE
  • 的长度 高于+ 1的
  • cumsum为您提供每次运行中第一条记录的索引
  • head(...,-1)最后一个元素的修剪
  • c(1, ...)添加第一个索引 - 应该始终包含在定义中

答案 1 :(得分:0)

这里有很多小动作,但最终结果可以让你到达目的地:

hyljes <- [YOUR DATA]
hyljes$DATE <- as.POSIXct(hyljes$DATE, format = "%Y-%m-%d %H:%M:%S")

hyljes$hour <- strftime(hyljes$DATE, '%H')
hyljes$date <- strftime(hyljes$DATE, '%Y-%m-%d')
hyljes$am_pm <- ifelse(hyljes$hour < 12, 'am', 'pm')

mins <- ddply(hyljes, .(date, am_pm), summarise, min = min(DATE))$min

hyljes[hyljes[, 1] %in% mins, 1:2]

                  DATE v
1  2007-07-28 00:41:00 1
9  2007-07-28 13:20:52 4
13 2007-07-29 01:01:48 2