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

作者: celestialgod (天)   2016-12-03 00:16:28
※ 引述《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 的版本和套件版本資訊,
: 讓版友更容易找出錯誤
:
: [關鍵字]:
:
: 選擇性,也許未來有用
:
# 概念是我直接算站間時間,然後把停留時間的部分在過濾掉而已
# data.table:
library(data.table)
library(fasttime)
library(pipeR)
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')
DT[ , Time := fastPOSIXct(Time)]
cumany <- function(x) cumsum(x) >= 1
DT[ , .(timeBetweenStops = tail(Time, length(Time)-1) -
head(Time, length(Time)-1),
filter = cumany(head(Leave, length(Leave)-1)),
NameZhLeave = head(NameZh, length(NameZh)-1),
NameZhNext = tail(NameZh, length(NameZh)-1)), by = .(UniqueBusID)] %>>%
`[`(i = which(filter)) %>>%
`[`(j = cumTimeBetweenStops := cumsum(as.numeric(timeBetweenStops)),
by = .(UniqueBusID)) %>>%
`[`(NameZhLeave != NameZhNext) %>>%
`[`(j = .(UniqueBusID, timeBetweenStops, cumTimeBetweenStops))
# UniqueBusID timeBetweenStops cumTimeBetweenStops
# 1: 大興一街->屯區藝文中心162 7 secs 7
# 2: 大興一街->屯區藝文中心162 29 secs 48
# 3: 屯區藝文中心->莒光新城163 32 secs 32
# 4: 屯區藝文中心->莒光新城163 5 secs 47
# dplyr的部分,過幾天補,先寫完了data.table,就先PO了
作者: joson4921 (特務)   2016-12-03 17:25:00
謝謝c大分享,剛消化完另一位c大的寫法,換研究這個寫法

Links booklink

Contact Us: admin [ a t ] ucptt.com