Re: [問題] 以時間間隔為條件,抽取資料
※ 引述《anakinyen (我在台北 天氣晴)》之銘言:
: 遇到一個可能是很新手的問題
: 跳出迴圈指令跑完後
: + break
: + }
: Error in as.POSIXct.default(time1) :
: do not know how to convert 'time1' to class “POSIXct”
這問題是你的time1不是時間格式,是character造成的
: > sambar[ , diffTime := NULL]
: Warning message:
: In `[.data.table`(sambar, , `:=`(diffTime, NULL)) :
: Adding new column 'diffTime' then assigning NULL (deleting it).
這個也同理
: 我猜是因為difftime預設的處理資料格式是 hh:mm,沒有把日期考慮進去
這個猜測不對,difftime吃的是POSIXct 或是 POSIXlt class的東西
你在用read.csv讀入資料的時候,你那個時間格式不會被正確解讀成那兩個class
所以只會被當成字串處理,因此我下面給你一段程式去把你的時間格式轉成POSIXct
: 但我試了半天都沒改成功
: 也不太確定我的資料檔日期格式是否正確
: 目前格式長這樣 2012/11/1 6:04,不知道1號是不是該改成01,6點該改成06 ?
: 再麻煩大大們幫忙了,感謝
資料讀入後,請用
library(data.table)
sambar <- read.csv(...)
setDT(sambar)
sambar[ , time1 := as.POSIXct(time1, format = "%Y/%m/%d %H:%M")]
# time1是你的時間變數
: ※ 引述《celestialgod (天)》之銘言:
: : 我用while + data.table做,若用data.frame會複製很多次,效率會不彰
: : library(data.table)
: : # 產生資料
: : numObs <- 50
: : numInd <- 5
: : DT <- data.table(ind = paste0("A", sample(numInd, numObs, TRUE)),
: : time = strptime("2012/12/11", "%Y/%m/%d") +
: : sample(86400, numObs, TRUE),
: : obs = rnorm(numObs))
: : # 排序
: : setorder(DT, ind, time, obs)
: : # 移除掉時間差小於六小時的
: : k <- 1
: : while ( TRUE ) {
: : # 計算時間差,以小時表示
: : DT[ , diffTime := difftime(time, time[min(k, .N)], units="hours"), by = ind]
: : # 留下自己那一組
: : set(DT, which(DT$diffTime == 0), which(names(DT) == "diffTime"), 1e6)
: : # 留下時間差超過六小時的
: : DT <- DT[abs(diffTime) > 6, ]
: : # 下一組
: : k <- k + 1
: : # 如果k大於某組的觀測值數目就跳離迴圈
: : if (k > max(DT[ , .(numObsGroup = .N), by = ind]$numObsGroup))
: : break
: : }
: : DT[ , diffTime := NULL]
: : 五萬筆觀測值,一千個個體,耗時0.23秒 (平均一個個體50個觀測值)
: : 五十萬筆觀測值,一千個個體,耗時0.39秒 (平均一個個體500個觀測值)
: : 我覺得這個速度應該可以接受
: : 不過我的區間只有24小時,所以可能都很快就篩選完了
: : 有人可以試試看更長時間的表現
: : 有問題或任何人有更好解法,歡迎提供,感謝
: : Note: 間隔一百天,五十萬筆觀測值,一千個個體,耗時18.33秒
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.246.24.51
※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1486553955.A.05A.html
推
02/08 23:13, , 1F
02/08 23:13, 1F
str(sambar) 看一下結果是什麼
推
02/08 23:28, , 2F
02/08 23:28, 2F
一樣的錯誤是這一個嗎? Error in as.POSIXct.default(time1)
還是In `[.data.table`(sambar, , `:=`(diffTime, NULL)) :
Adding new column 'diffTime' then assigning NULL (deleting it).
不管是哪個,記得要把下面這段改成你的時間變數名稱
DT[ , diffTime := difftime(Time, Time[min(k, .N)], units="hours"), by = ind]
如果改過還是有問題,可能要把你資料給我看一下
推
02/08 23:43, , 3F
02/08 23:43, 3F
→
02/08 23:45, , 4F
02/08 23:45, 4F
→
02/08 23:46, , 5F
02/08 23:46, 5F
→
02/08 23:47, , 6F
02/08 23:47, 6F
搞定就好
※ 編輯: celestialgod (111.246.24.51), 02/09/2017 00:26:36
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 6 之 8 篇):
R_Language 近期熱門文章
PTT數位生活區 即時熱門文章