看板 R_Language 關於我們 聯絡資訊
這用 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 : : [環境敘述]: : : : [關鍵字]: : : 選擇性,也許未來有用 : -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.118.4.49 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1502134178.A.B42.html
cywhale: 推~也可用data.table中提供shift(...,fill=0) 道理一樣~ 08/08 08:58
joson4921: 謝謝andrew43大大的提點,下午有成功改出來了;也謝謝c 08/08 19:12
joson4921: 大大提供的建議 08/08 19:12