Re: [問題] 不同資料集欄位比對,再輸出比對結果

作者: celestialgod (天)   2016-12-25 18:34:37
※ 引述《joson4921 (特務)》之銘言:
:
: - 問題: 當你想要問問題時,請使用這個類別。
:
: [問題類型]:
:
: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
:
: [軟體熟悉度]:
:
: 入門(寫過其他程式,只是對語法不熟悉)
:
: [問題敘述]:
:
: 手邊有兩個資料集,分別是 data1 (預計發車時間), data2 (實際發車時間)
: 我想做的事情是根據起站發車班表 data1 ,寫個判斷式進行時間比對
: 先上兩個資料集的格式與內容示意
: data1 data2 預期結果
: Bus_No. DepartureTime DepartureTime Bus_No.
: 1 5:50 2015-12-25 06:51:20 4
: 2 6:10 2015-12-26 06:53:30 4
: 3 6:30 2015-12-27 06:29:58 3
: 4 6:50 2015-12-28 05:52:32 1
: 5 7:10 2015-12-29 07:09:24 5
: 判斷式的判斷條件:
: data1是預計發車時間,data2是實際發車時間,
: 比對方式:找實際發車時間與預計發車時間差距最小者(發車前後5分鐘都認定為該Bus_No.)
: Bus_No.的判定結果目前是打算用dpylr加在data2的Departure欄位後面,
: 最後結果輸出為data3(內含 DepartureTime 和 Bus_No. 兩個欄位)
: 碰到的問題:
: 1.卡在不同資料集的欄位資料比對
: 2.data1的Departure欄位 和 data2的Departure欄位 時間格式不一樣,不知怎麼寫判斷式
兩個格式都轉成POSIXct就好,data1的年月日可以隨便給一個,下面給1990/01/01
在mapping條件的時候,再把data2的年月日align data1的就好了
: 以上問題還要再麻煩各位大大解惑了@@
:
: [程式範例]:
:
: data3 <- data2[.(這邊應該是寫時間判斷的東西,但我想不出怎麼寫), ] %>%
: .[.(DepartureTime, Bus_No.)]
:
: [環境敘述]:
:
: 請提供 sessionInfo() 的輸出結果,
: 裡面含有所有你使用的作業系統、R 的版本和套件版本資訊,
: 讓版友更容易找出錯誤
:
: [關鍵字]:
:
: dplyr
:
寫得很醜,不過用data.table的foverlap或是non-equi joins應該會是比較簡單的做法
dplyr作法就等別人補充吧~~~
好讀版:http://pastebin.com/4jZLUSLF
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
還有任何問題再推文吧~~~

Links booklink

Contact Us: admin [ a t ] ucptt.com