作者celestialgod (天)
看板R_Language
标题Re: [问题] 以时间间隔为条件,抽取资料
时间Mon Feb 6 21:47:56 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可以用在这个案例
: 非常感谢~~
我用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://webptt.com/cn.aspx?n=bbs/R_Language/M.1486388879.A.9C1.html
c大这个好强@@,我喜欢XD
2F:→ anakinyen: 非常感谢~~ 我来试试看 02/07 11:24
有问题可以再推文问
※ 编辑: celestialgod (111.246.24.51), 02/08/2017 19:44:09
3F:推 cywhale: 後来稍微尝试roll join 但不适合原po这个题目 因为他是 02/09 15:17
4F:→ cywhale: 循序要第一笔 然後大於6hr该笔,再循序下找,没法一次做 02/09 15:18