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

看板R_Language作者 (天)時間9年前 (2016/12/25 18:34), 9年前編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《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 還有任何問題再推文吧~~~ -- R資料整理套件系列文: magrittr #1LhSWhpH (R_Language) https://goo.gl/72l1m9 data.table #1LhW7Tvj (R_Language) https://goo.gl/PZa6Ue dplyr(上.下) #1LhpJCfB,#1Lhw8b-s (R_Language) https://goo.gl/I5xX9b tidyr #1Liqls1R (R_Language) https://goo.gl/i7yzAz pipeR #1NXESRm5 (R_Language) https://goo.gl/zRUISx -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.165.234.127 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1482662080.A.3B8.html ※ 編輯: celestialgod (1.165.234.127), 12/25/2016 18:56:51

12/30 12:08, , 1F
有成功輸出結果了,雖然試寫dplyr失敗但還是謝謝大大!!
12/30 12:08, 1F
文章代碼(AID): #1ONw30Eu (R_Language)
文章代碼(AID): #1ONw30Eu (R_Language)