[問題] 快速產生column, 和前幾個row相依

看板R_Language作者 (sigh...)時間10年前 (2014/08/30 05:03), 10年前編輯推噓0(006)
留言6則, 1人參與, 最新討論串1/2 (看更多)
[問題類型]: 效能諮詢(我想讓R 跑更快) [軟體熟悉度]: 入門(寫過其他程式,只是對語法不熟悉) [問題敘述]: 有一組 data 已照 ID, Time 排序 需要產生一個 column (Session), 將相隔一固定時間 (1hr) 內的算在同一個 Session。 Ex: ID Time Session 1 2014-08-28 00:00:00 1 1 2014-08-28 00:23:33 1 1 2014-08-28 00:59:59 1 1 2014-08-28 01:00:00 2 1 2014-08-28 02:30:00 3 1 2014-08-28 03:29:59 3 2 2014-08-28 00:00:01 1 每個列和前幾列相依且未知有幾列, 似乎只能用 for loop 做一次 linear scan, 資料量約 1~10 萬 rows/day, 要處理好幾個月的資料。 不曉得有什麼好方法? 目前 13000 rows 約花 3.5 sec, 用 compiler 套件加速到 3.3 sec data.table 極慢, 要 30 sec 用 python 的 pandas 套件用同樣的方法寫 for loop 只要 600 ms。 希望 R 至少能做到和 python 速度類似。 [程式範例]: 張貼能夠重現錯誤的程式碼,可以幫助版友更快的幫你解決問題 目前產生新 column 大概是這樣 data$Session <- 0 id <- data[1, 'ID'] session.start <- data[1, 'Time'] data[1, 'Session'] <- 1 for (row in 2:nrow(data)) { if (id != data[row, 'ID']) { session.start <- data[row, 'Time'] data[row, 'Session'] <- 1 id <- data[row, 'ID'] } else { if (as.numeric(data[row, 'Time'] - data[row-1, 'Time'], unit='hours') >= 1) { # Start a new session data[row, 'Session'] <- data[row-1, 'Session']+1 session.start <- data[row, 'Time'] } else { data[row, 'Session'] <- data[row-1, 'Session'] } } } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 66.228.162.44 ※ 文章網址: http://www.ptt.cc/bbs/R_Language/M.1409346226.A.6EB.html ※ 編輯: forloricever (66.228.162.44), 08/30/2014 05:05:08 ※ 編輯: forloricever (66.228.162.44), 08/30/2014 05:05:51 ※ 編輯: forloricever (66.228.162.44), 08/30/2014 05:06:53 ※ 編輯: forloricever (66.228.162.44), 08/30/2014 05:10:52 ※ 編輯: forloricever (66.228.162.44), 08/30/2014 08:05:48

08/31 21:54, , 1F
1. 把時間全部換算成秒 2. 每小時就是3600秒
08/31 21:54, 1F

08/31 21:55, , 2F
用這個邏輯去判斷 就可以很快
08/31 21:55, 2F

08/31 21:56, , 3F
strsplit(data[,"Time"]," |:|-",fixed=FALSE)
08/31 21:56, 3F

08/31 21:57, , 4F
as.numeric()
08/31 21:57, 4F

08/31 22:05, , 5F
比方說 你的 Time 是 c(1秒,3599秒,3601秒)
08/31 22:05, 5F

08/31 22:05, , 6F
直接除以3600後 取 trunc()就可以得到 category
08/31 22:05, 6F
文章代碼(AID): #1K0EgoRh (R_Language)
文章代碼(AID): #1K0EgoRh (R_Language)