Re: [問題] 以時間間隔為條件,抽取資料
※ 引述《anakinyen (我在台北 天氣晴)》之銘言:
: [問題類型]:
:
: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
:
: [軟體熟悉度]:
: 新手,只會套用package
: [問題敘述]:
: 我有一批動物研究的資料
: 資料大致長這個樣子,共有12隻個體一萬多筆
: 個體A 2012/10/11 20:00 實驗資料OOXX
: 個體A 2012/10/11 23:00 實驗資料OOXX
: 個體A 2012/10/12 03:00 實驗資料OOXX
: 個體B 2012/12/11 05:00 實驗資料OOXX
: 個體B 2012/12/11 11:05 實驗資料OOXX
: 個體B 2012/12/11 13:00 實驗資料OOXX
: 個體B 2012/12/11 18:00 實驗資料OOXX
: 個體B 2012/12/11 20:00 實驗資料OOXX
: 由於時間間隔過短的話,資料之間可能有相關性
: 因此我現在想要設定6小時的閥值,間隔超過6小時的資料才會保留
: 以上面資料為例
: A個體保留第一、第三筆資料
: B個體保留第一、第二、第四筆資料
: 我的程度是新手,偶爾會拿一些package來套用
: 請教是否有相關套件或現成code可以用在這個案例
: 非常感謝~~
我用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
}
# 移除diffTime這個變數
DT[ , diffTime := NULL]
五萬筆觀測值,一千個個體,耗時0.23秒 (平均一個個體50個觀測值)
五十萬筆觀測值,一千個個體,耗時0.39秒 (平均一個個體500個觀測值)
我覺得這個速度應該可以接受
不過我的區間只有24小時,所以可能都很快就篩選完了
有人可以試試看更長時間的表現
有問題或任何人有更好解法,歡迎提供,感謝
Note: 間隔一百天,五十萬筆觀測值,一千個個體,耗時18.33秒
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.234.179.110
※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1486388879.A.9C1.html
推
02/06 23:53, , 1F
02/06 23:53, 1F
c大這個好強@@,我喜歡XD
→
02/07 11:24, , 2F
02/07 11:24, 2F
有問題可以再推文問
※ 編輯: celestialgod (111.246.24.51), 02/08/2017 19:44:09
推
02/09 15:17, , 3F
02/09 15:17, 3F
→
02/09 15:18, , 4F
02/09 15:18, 4F
討論串 (同標題文章)
R_Language 近期熱門文章
PTT數位生活區 即時熱門文章