Re: [問題] 特定條件下的列與列時間運算

看板R_Language作者時間9年前 (2016/12/02 13:53), 9年前編輯推噓1(108)
留言9則, 2人參與, 最新討論串2/3 (看更多)
library(data.table) library(magrittr) dt <- fread('Goback, NameZh, Leave, Time, UniqueBusID 0, 大興一街, TRUE, 2015/1/1 13:10:32, 大興一街->屯區藝文中心162 0, 大興五街, FALSE, 2015/1/1 13:10:39, 大興一街->屯區藝文中心162 0, 大興五街, TRUE, 2015/1/1 13:10:51, 大興一街->屯區藝文中心162 0, 屯區藝文中心, FALSE, 2015/1/1 13:11:20, 大興一街->屯區藝文中心162 0, 屯區藝文中心, TRUE, 2015/1/1 13:12:32, 大興一街->屯區藝文中心162 1, 屯區藝文中心, FALSE, 2015/1/1 13:36:50, 屯區藝文中心->莒光新城163 1, 屯區藝文中心, TRUE, 2015/1/1 13:36:56, 屯區藝文中心->莒光新城163 1, 大興五街, FALSE, 2015/1/1 13:37:28, 屯區藝文中心->莒光新城163 1, 大興五街, TRUE, 2015/1/1 13:37:38, 屯區藝文中心->莒光新城163 1, 大興一街, FALSE, 2015/1/1 13:37:43, 屯區藝文中心->莒光新城163', sep=",", header=T) dt[,Time:=as.POSIXct(strptime(Time,"%Y/%m/%d %H:%M:%S"))] %>% .[,c("rid","qid") := list(.I, .I[which(Leave==TRUE)][1L]),by=.(UniqueBusID)] out <- dt[qid==rid | (rid>qid & Leave==FALSE), {.(qid=qid, rid=rid, dif= Time-Time[rid==qid])}, by=.(UniqueBusID)] %>% .[qid!=rid, .(UniqueBusID, dif)] # UniqueBusID dif #1: 大興一街->屯區藝文中心162 7 secs #2: 大興一街->屯區藝文中心162 48 secs #3: 屯區藝文中心->莒光新城163 32 secs #4: 屯區藝文中心->莒光新城163 47 secs ※ 引述《joson4921 (特務)》之銘言: : : - 問題: 當你想要問問題時,請使用這個類別。 : : [問題類型]: : : 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) : : [軟體熟悉度]: : : 入門(寫過其他程式,只是對語法不熟悉) : : [問題敘述]: : 請簡略描述你所要做的事情,或是這個程式的目的 : 各位先進大家好,為了方便敘述問題,先節錄以下資料方便說明: : Goback NameZh Leave Time UniqueBusID : 0 大興一街 TRUE 2015/1/1 13:10:32 大興一街->屯區藝文中心162 : 0 大興五街 FALSE 2015/1/1 13:10:39 大興一街->屯區藝文中心162 : 0 大興五街  TRUE  2015/1/1 13:10:51 大興一街->屯區藝文中心162 : 0 屯區藝文中心 FALSE 2015/1/1 13:11:20 大興一街->屯區藝文中心162 : 0 屯區藝文中心 TRUE 2015/1/1 13:12:32 大興一街->屯區藝文中心162 : 1 屯區藝文中心 FALSE 2015/1/1 13:36:50 屯區藝文中心->莒光新城163 : 1 屯區藝文中心 TRUE 2015/1/1 13:36:56 屯區藝文中心->莒光新城163 : 1 大興五街 FALSE 2015/1/1 13:37:28 屯區藝文中心->莒光新城163 : 1 大興五街 TRUE 2015/1/1 13:37:38 屯區藝文中心->莒光新城163 : 1 大興一街 FALSE 2015/1/1 13:37:43 屯區藝文中心->莒光新城163 :   當 Leave = TRUE 代表車輛離站 : 當 Leave = FALSE 代表車輛到站 : 我想做資料處理問題如下所述: : 1、列與列之間的時間運算(同一班車計算站間旅行時間) : 前一班車: 大興一街(TRUE,第1筆) -> 大興五街(FALSE,第2筆) 00:00:07 : 大興一街(TRUE,第1筆) -> 屯區藝文中心(FALSE,第4筆) 00:00:48 :   後一班車:屯區藝文中心(TRUE,第7筆) -> 大興五街(FALSE,第8筆) 00:00:32 :        屯區藝文中心(TRUE,第7筆) -> 大興一街(FALSE,第10筆) 00:00:47 : 之前曾經來板上問過,知道對UniqueBusID用groupby下去, : 就可以把不同班車的資料切分開來處理,以資料為例,前5筆和後5筆分別是不同班車 : 而我想求的是站間旅行時間,因此必須計算列與列之間的時間差, : 但是這邊我希望程式可以自動判斷 : (1) 當上下兩列的UniqueBusID一樣的時候才計算站間旅行時間 : (2) 第5筆資料其實是無用的,因為終點站只需要到達時間(Leave=FALSE) : 所以希望程式跳過不執行 : (3) 當上下兩列的UniqueBusID不同時,則計算時間的基準改為新的資料 : 以前一班車為例,站間旅行時間計算基準是第1筆資料(Leave = TRUE,車輛離站) : 但是第6筆資料開始UniqueBusID改變了(不同車班) : 故後一班車的站間旅行時間計算基準改為第7筆資料(Leave = TRUE,車輛離站) : 試了好幾天試不出來想要的結果,可能是我對R的函數不熟悉的關係 : 有請板上各位先進指點迷津,非常感謝!! : [程式範例]: : : [環境敘述]: : : 請提供 sessionInfo() 的輸出結果, : 裡面含有所有你使用的作業系統、R 的版本和套件版本資訊, : 讓版友更容易找出錯誤 : : [關鍵字]: : : 選擇性,也許未來有用 : -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.65.48 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1480658003.A.539.html ※ 編輯: cywhale (140.112.65.48), 12/02/2016 13:54:16

12/03 17:20, , 1F
謝謝C大分享qid和rid來處理指定列運算的想法,不過看了
12/03 17:20, 1F

12/03 17:21, , 2F
老半天暫時還沒搞懂list那一列在做啥,可能要再研究
12/03 17:21, 2F

12/03 18:16, , 3F
你執行看看 or library(data.table); ? .I 有.I[1]的介紹
12/03 18:16, 3F

12/03 18:24, , 4F
.I[1],by=xx 就是根據by分類只選列編號的的第一個元素
12/03 18:24, 4F

12/03 18:25, , 5F
但因你的時間差要根據Leave第一筆來算所以多了which()
12/03 18:25, 5F

12/03 18:27, , 6F
所以有了qid你就知道誰是分類(BusID)的第一筆,再用rid
12/03 18:27, 6F

12/03 18:28, , 7F
rid=.I 就是整體的列編號去減,就得到你要的時間差..
12/03 18:28, 7F

12/03 18:29, , 8F
其實是很簡單的想法,就是要抓到分類第一筆,和我要比對
12/03 18:29, 8F

12/03 18:29, , 9F
的每一筆的index,有了index就可以做正確的運算
12/03 18:29, 9F
文章代碼(AID): #1OGGnJKv (R_Language)
文章代碼(AID): #1OGGnJKv (R_Language)