作者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://webptt.com/cn.aspx?n=bbs/R_Language/M.1486399622.A.7DD.html
※ 编辑: f496328mm (42.66.10.146), 02/07/2017 00:57:29
1F:→ celestialgod: 这样真的不对XDD,如果第一笔是1点,第二笔是五点, 02/07 08:14
2F:→ celestialgod: 第三笔是八点,照原po逻辑是留1,3笔,可是取前後差 02/07 08:15
3F:→ celestialgod: 六小时只会留第一笔 02/07 08:15
4F:→ celestialgod: 再来是资料要生成间隔三天,只要在time後面的86400 02/07 08:15
5F:→ celestialgod: 加上*3就好 02/07 08:15
6F:→ clansoda: 这个做法我一开始想过 不过看起来好像不是他要的 02/07 08:44
7F:推 anakinyen: 如前两楼所说,这方法不适用此状况,无论如何还是谢谢 02/07 11:23