R编程 - 对特定时间数据进行子集化

时间:2015-02-04 10:28:16

标签: r postgresql

C
                   State         State.Start           State.End State.Duration
1  UDT/Maintenance delay 01.02.2015 08:00:00 01.02.2015 08:10:00            600
2  UDT/Maintenance delay 01.02.2015 08:10:00 01.02.2015 08:40:00           1800
9            No material 01.02.2015 08:20:00 01.02.2015 08:40:00           1200
29 UDT/Maintenance delay 01.02.2015 14:00:00 01.02.2015 14:45:00           2700
35           No material 01.02.2015 16:00:00 01.02.2015 17:40:00           6000
45           No material 01.02.2015 17:30:00 01.02.2015 17:40:00            600
72           No material 01.02.2015 21:01:00 01.02.2015 23:30:00           8940
81           No material 01.02.2015 22:00:00 02.02.2015 01:38:00          13080
88       ENG/Engineering 01.02.2015 23:30:00 02.02.2015 01:11:00           6060
93 SDT/Maintenance delay 02.02.2015 02:30:00 02.02.2015 04:25:00           6900
95       ENG/Engineering 02.02.2015 04:25:00 02.02.2015 04:25:00              0

以上数据由机器提供    我想执行子集化操作

Delay_Time <- subset(C, State == "No material")  

我的输出是

Delay_Time
         State         State.Start           State.End State.Duration
9  No material 01.02.2015 08:20:00 01.02.2015 08:40:00           1200
35 No material 01.02.2015 16:00:00 01.02.2015 17:40:00           6000
45 No material 01.02.2015 17:30:00 01.02.2015 17:40:00            600
72 No material 01.02.2015 21:01:00 01.02.2015 23:30:00           8940
81 No material 01.02.2015 22:00:00 02.02.2015 01:38:00          13080

如果您在上面的Delay_time子集中看到了 第二行的时间段是16:00:00到17:40:00
第三排的时间段为17:30:00至17:40:00
第三行时间已经是第二行的一部分(已预订)
在我的子集中,我不想让这些第三行像案件一样 是否可以通过避免第三行等情况来进行子集化。?

2 个答案:

答案 0 :(得分:2)

这是使用data.table

的简单/高效解决方案
library(data.table)
unique(setDT(C)[State == "No material"], by = "State.End")
#          State         State.Start           State.End State.Duration
# 1: No material 01.02.2015 08:20:00 01.02.2015 08:40:00           1200
# 2: No material 01.02.2015 16:00:00 01.02.2015 17:40:00           6000
# 3: No material 01.02.2015 21:01:00 01.02.2015 23:30:00           8940
# 4: No material 01.02.2015 22:00:00 02.02.2015 01:38:00          13080

使用dplyr

的类似解决方案
library(dplyr)
C %>%
  filter(State == "No material") %>%
  distinct(State.End)
#         State         State.Start           State.End State.Duration
# 1 No material 01.02.2015 08:20:00 01.02.2015 08:40:00           1200
# 2 No material 01.02.2015 16:00:00 01.02.2015 17:40:00           6000
# 3 No material 01.02.2015 21:01:00 01.02.2015 23:30:00           8940
# 4 No material 01.02.2015 22:00:00 02.02.2015 01:38:00          13080

答案 1 :(得分:1)

抱歉,我不习惯使用subset()功能。您可以使用[]找到解决方案。

s_e_aux    <- C$State.End[C$State!="No material"]
Delay_Time <- C[C$State=="No material" & !C$State.End%in%s.e.aux,]