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

看板R_Language作者 (攸藍)時間9年前 (2014/08/30 07:20), 9年前編輯推噓4(403)
留言7則, 2人參與, 最新討論串2/2 (看更多)
可以試試看tapply做 會比迴圈再快一點 我自己模擬了一筆13000左右的資料只比迴圈快1.86倍 我有試過把比過的跳掉,可是發現變更慢 還在想有沒有什麼方法更快 code: data$Session = unlist(tapply(data$Time, data$ID, function(v){ output = rep(0, length(v)) i = 1 session_num = 1 repeat { loc = as.numeric(v - v[i], unit='hours') < 1 & output == 0 output[loc] = session_num session_num = session_num + 1 i = i + sum(loc) if(i > length(v)) break } output })) 模擬資料: set.seed(100) n = 2100 data = data.frame(ID = rep(1:n, ceiling(runif(n) * 10) + 1)) nrow(data) # 13812 data$Time = Reduce(c, tapply(rep(1, nrow(data)), data$ID, function(v){ start_time = strptime("2014-08-01 00:00:00", "%Y-%m-%d %H:%M:%S") as.POSIXlt(sort(start_time + round(86400 * runif(length(v))))) })) 迴圈:5.301304 secs tapply: 2.846163 secs -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.164.193.78 ※ 文章網址: http://www.ptt.cc/bbs/R_Language/M.1409354422.A.A2C.html

08/30 07:24, , 1F
感謝! 來試試
08/30 07:24, 1F
不客氣,只是你的迴圈版本跑出來的結果是錯的,你可能要檢查一下你有沒有貼錯。

08/30 07:29, , 2F
可能有貼錯, 砍了改了一些 code
08/30 07:29, 2F
※ 編輯: celestialgod (218.164.193.78), 08/30/2014 07:42:53

08/30 08:05, , 3F
已修正
08/30 08:05, 3F

08/30 08:09, , 4F
可再請問tapply如何產生在一次loop 生二個 column?
08/30 08:09, 4F

08/30 08:10, , 5F
ex有個 col:Date 把同一個ID, session 都設為第一個
08/30 08:10, 5F

08/30 23:18, , 6F
你時間轉成POSIXct,不要用POSIXlt, 大概還可以降一半
08/30 23:18, 6F

08/30 23:37, , 7F
再把時間差改成difftime(v, v[i], unit='hours') < 1
08/30 23:37, 7F
文章代碼(AID): #1K0Ggsei (R_Language)
文章代碼(AID): #1K0Ggsei (R_Language)