看板 R_Language 關於我們 聯絡資訊
[問題類型]: 效能諮詢(我想讓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
gsuper: 1. 把時間全部換算成秒 2. 每小時就是3600秒 08/31 21:54
gsuper: 用這個邏輯去判斷 就可以很快 08/31 21:55
gsuper: strsplit(data[,"Time"]," |:|-",fixed=FALSE) 08/31 21:56
gsuper: as.numeric() 08/31 21:57
gsuper: 比方說 你的 Time 是 c(1秒,3599秒,3601秒) 08/31 22:05
gsuper: 直接除以3600後 取 trunc()就可以得到 category 08/31 22:05