Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- library(data.table)
- # data generation
- numBus <- 20L
- departTimeSpan <- "20 mins"
- data1 <- data.table(busNo = 1L:numBus,
- departTime = seq.POSIXt(as.POSIXct("1990-01-01 05:50:00"),
- by = departTimeSpan, length.out = numBus))
- ## data1
- # busNo departTime
- # 1: 1 1990-01-01 05:50:00
- # 2: 2 1990-01-01 06:10:00
- # 3: 3 1990-01-01 06:30:00
- # 4: 4 1990-01-01 06:50:00
- # 5: 5 1990-01-01 07:10:00
- # 6: 6 1990-01-01 07:30:00
- # 7: 7 1990-01-01 07:50:00
- # 8: 8 1990-01-01 08:10:00
- # 9: 9 1990-01-01 08:30:00
- # 10: 10 1990-01-01 08:50:00
- # 11: 11 1990-01-01 09:10:00
- # 12: 12 1990-01-01 09:30:00
- # 13: 13 1990-01-01 09:50:00
- # 14: 14 1990-01-01 10:10:00
- # 15: 15 1990-01-01 10:30:00
- # 16: 16 1990-01-01 10:50:00
- # 17: 17 1990-01-01 11:10:00
- # 18: 18 1990-01-01 11:30:00
- # 19: 19 1990-01-01 11:50:00
- # 20: 20 1990-01-01 12:10:00
- # 產生2015/10/01~2015/12/31中前後五分鐘的班次
- dataCnt <- 5L
- data2 <- data.table(departTime = sample(data1$departTime, dataCnt, TRUE) +
- as.difftime(sample(9404:9495, dataCnt, TRUE), units = "days") +
- as.difftime(sample(-300:300, dataCnt, TRUE), units = "secs"))
- # departTime
- # 1: 2015-11-25 08:49:53
- # 2: 2015-10-27 09:47:25
- # 3: 2015-11-02 10:27:39
- # 4: 2015-10-18 08:11:40
- # 5: 2015-12-02 09:11:13
- ## method 1
- # find the departure time range
- diffTime5mins <- as.difftime(5, units = "mins")
- data1[ , start := departTime - diffTime5mins]
- data1[ , end := departTime + diffTime5mins]
- setkey(data1, start, end)
- # align time to 1990/01/01
- data2[ , start := departTime - floor(departTime - as.POSIXct("1990-01-01 00:00:00"))]
- data2[ , end := start]
- # use foverlaps to find the busNo
- foverlaps(data2, data1)[ , .(i.departTime, busNo)]
- # i.departTime busNo
- # 1: 2015-11-25 08:49:53 10
- # 2: 2015-10-27 09:47:25 13
- # 3: 2015-11-02 10:27:39 15
- # 4: 2015-10-18 08:11:40 8
- # 5: 2015-12-02 09:11:13 11
- ## method 2
- # find the departure time range
- diffTime5mins <- as.difftime(5, units = "mins")
- data1[ , start := departTime - diffTime5mins]
- data1[ , end := departTime + diffTime5mins]
- setkey(data1, start, end)
- # align time to 1990/01/01
- data2[ , departTimeAlign := departTime - floor(departTime - as.POSIXct("1990-01-01 00:00:00"))]
- # use Non-equi joins
- data2[data1, on = .(departTimeAlign >= start, departTimeAlign <= end), nomatch = 0][ , .(departTime, busNo)]
- # departTime busNo
- # 1: 2015-10-18 08:11:40 8
- # 2: 2015-11-25 08:49:53 10
- # 3: 2015-12-02 09:11:13 11
- # 4: 2015-10-27 09:47:25 13
- # 5: 2015-11-02 10:27:39 15
Advertisement
Add Comment
Please, Sign In to add comment