Re: [問題] 用不同條件抓data

作者: andrew43 (討厭有好心推文後刪文者)   2017-08-08 03:29:35
這用 data.table 很容易解。
library(data.table)
dt <- fread(
"Goback Toward TravelTime UniqueID
0 B1 104 BB02
0 B2 231 BB02
0 B3 245 BB02
0 B4 268 BB02
0 B5 313 BB02
1 A1 31 AA02
1 A2 83 AA02
1 A3 172 AA02
1 A4 198 AA02
1 A5 276 AA02
"
)
# 一個簡單的 function 回傳初值與其它前後差
funcDelta <- function(x) {
baseline <- min(x)
delta <- diff(x)
# 或是 delta <- diff(sort(x))
return(c(baseline, delta))
}
# try funcDelta
funcDelta(c(1,4,6,7)) # return c(1,3,2,1)
# 以下為所求
dt[,
.(deltaTravelTime = funcDelta(TravelTime), Toward),
by = UniqueID]
# UniqueID deltaTravelTime Toward
# 1: BB02 104 B1
# 2: BB02 127 B2
# 3: BB02 14 B3
# 4: BB02 23 B4
# 5: BB02 45 B5
# 6: AA02 31 A1
# 7: AA02 52 A2
# 8: AA02 89 A3
# 9: AA02 26 A4
# 10: AA02 78 A5
※ 引述《joson4921 (特務)》之銘言:
:
: - 問題: 當你想要問問題時,請使用這個類別。
:
: [問題類型]:
:
: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
:
: [軟體熟悉度]:
:
: 入門(寫過其他程式,只是對語法不熟悉)
:
: [問題敘述]:
: 請簡略描述你所要做的事情,或是這個程式的目的
: 手邊有資料 df 如下:
: Goback Toward TravelTime UniqueID
: 1 A1 32 AA01
: 1 A2 47 AA01
: 1 A3 83 AA01
: 1 A4 122 AA01
: 1 A5 143 AA01
: 0 B1 284 BB01
: 0 B2 302 BB01
: 0 B3 419 BB01
: 0 B4 492 BB01
: 0 B5 701 BB01
: 0 B1 104 BB02
: 0 B2 231 BB02
: 0 B3 245 BB02
: 0 B4 268 BB02
: 0 B5 313 BB02
: 1 A1 31 AA02
: 1 A2 83 AA02
: 1 A3 172 AA02
: 1 A4 198 AA02
: 1 A5 276 AA02
: 希望用同一 UniqueID 欄位的五筆資料,算出他們之間 TravelTime 的時間差(秒數)
: 並新增 TT_diff 欄位容納其結果,但這邊有個問題
: 因為 5筆 TravelTime資料只能產出 4個 時間差(秒數)
: 以 UniqueID == AA02 為例,產出之TT_diff欄位結果如下
: (第一筆 TT_diff = 83-31 = 52, 以此類推)
: TT_diff
: 52
: 89
: 26
: 78
: 但我希望產出的結果能夠長得像這樣
: 也用 UniqueID == AA02 的第一筆資料(TravelTime = 31)塞進去 TT_diff 欄位
: 後面再接上面產出的4個時間差,像下面這樣:
: TT_diff(我想要的結果)
: 31
: 52
: 89
: 26
: 78
: 因為之前用 [, := ] 跑運算(好像是magrittr?)沒有跑過這種同時設定兩種條件的
: 用別的方法試了兩天,弄不出我想要的結果,
: 如底下程式碼所示,那個31沒辦法出現在第一列.而且最後一列會出現NA
: 請問板上大大,如果要產出上面我想要的結果,程式碼該怎麼修正,謝謝!!
: [程式範例]:
:
: <我的程式碼>
: result <- df[ , .(TT_diff = TravelTime[2L:5L]-TravelTime[1L:4L] ),
: by=.(UniqueID)]
: TT_diff(跑出來的結果,跟想要的差很多)
: 52
: 89
: 26
: 78
: NA
:
: [環境敘述]:
:
:
: [關鍵字]:
:
: 選擇性,也許未來有用
:
作者: cywhale (cywhale)   2017-08-08 08:58:00
推~也可用data.table中提供shift(...,fill=0) 道理一樣~
作者: joson4921 (特務)   2017-08-08 19:12:00
謝謝andrew43大大的提點,下午有成功改出來了;也謝謝c大大提供的建議

Links booklink

Contact Us: admin [ a t ] ucptt.com