作者anakinyen (我在台北 天气晴)
看板R_Language
标题Re: [问题] 以时间间隔为条件,抽取资料
时间Wed Feb 8 13:07:04 2017
遇到一个可能是很新手的问题
跳出回圈指令跑完後
+ break
+ }
Error in as.POSIXct.default(time1) :
do not know how to convert 'time1' to class “POSIXct”
> sambar[ , diffTime := NULL]
Warning message:
In `[.data.table`(sambar, , `:=`(diffTime, NULL)) :
Adding new column 'diffTime' then assigning NULL (deleting it).
我猜是因为difftime预设的处理资料格式是 hh:mm,没有把日期考虑进去
但我试了半天都没改成功
也不太确定我的资料档日期格式是否正确
目前格式长这样 2012/11/1 6:04,不知道1号是不是该改成01,6点该改成06 ?
再麻烦大大们帮忙了,感谢
※ 引述《celestialgod (天)》之铭言:
: ※ 引述《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
: }
: DT[ , diffTime := NULL]
: 五万笔观测值,一千个个体,耗时0.23秒 (平均一个个体50个观测值)
: 五十万笔观测值,一千个个体,耗时0.39秒 (平均一个个体500个观测值)
: 我觉得这个速度应该可以接受
: 不过我的区间只有24小时,所以可能都很快就筛选完了
: 有人可以试试看更长时间的表现
: 有问题或任何人有更好解法,欢迎提供,感谢
: Note: 间隔一百天,五十万笔观测值,一千个个体,耗时18.33秒
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.112.84.115
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1486530426.A.8B6.html