作者f496328mm (為什麼會流淚)
看板R_Language
標題Re: [問題] 以時間間隔為條件,抽取資料
時間Tue Feb 7 00:47:00 2017
※ 引述《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可以用在這個案例
: 非常感謝~~
借用 celestialgod 大大的函數去生data
我的想法是 新生成一個變數 interval , 當作時間間隔 , 再去篩選 >6 的
library(data.table)
library(dplyr)
#生data 3天
numObs <- 10
numInd <- 3
data1 <- data.table(ind = ( sample(numInd, numObs, TRUE)),
time = strptime("2012/12/10", "%Y/%m/%d") +
sample(86400, numObs, TRUE),
obs = rnorm(numObs))
data2 <- data.table(ind = ( sample(numInd, numObs, TRUE)),
time = strptime("2012/12/11", "%Y/%m/%d") +
sample(86400, numObs, TRUE),
obs = rnorm(numObs))
data3 <- data.table(ind = ( sample(numInd, numObs, TRUE)),
time = strptime("2012/12/12", "%Y/%m/%d") +
sample(86400, numObs, TRUE),
obs = rnorm(numObs))
#合併 & 排序
data = rbind(data1,data2,data3) %>% arrange(ind,time)
#計算時間差
data$interval = c( 0 ,
difftime(data$time[ 2:length(data$time) ] ,
data$time[ 1:( length(data$time)-1 ) ] , units="hours" )
)
#篩選時間差 >6 的
x = data %>% filter( . , interval>6 )
#------------------------------------------------------
我並沒有處理 ind: 1跳到2時 必須重新計算時間間隔
由於我按照 ind & time 排序
2的第一個interval會是負的
並不影響我們篩選 interval>6
#------------------------------------------------------
150萬筆
user system elapsed
0.27 0.07 0.33
150萬筆我是用 min>6 去篩選
因為用hour會抓不到東西
畢竟24小時間隔內 生太多data
會無法出現間隔 >6 hour的情況
#------------------------------------------------
如果有bug歡迎討論
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 42.66.10.146
※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1486399622.A.7DD.html
※ 編輯: f496328mm (42.66.10.146), 02/07/2017 00:57:29
→ celestialgod: 這樣真的不對XDD,如果第一筆是1點,第二筆是五點, 02/07 08:14
→ celestialgod: 第三筆是八點,照原po邏輯是留1,3筆,可是取前後差 02/07 08:15
→ celestialgod: 六小時只會留第一筆 02/07 08:15
→ celestialgod: 再來是資料要生成間隔三天,只要在time後面的86400 02/07 08:15
→ celestialgod: 加上*3就好 02/07 08:15
→ clansoda: 這個做法我一開始想過 不過看起來好像不是他要的 02/07 08:44
推 anakinyen: 如前兩樓所說,這方法不適用此狀況,無論如何還是謝謝 02/07 11:23