作者celestialgod (天)
看板R_Language
标题Re: [问题] 以时间间隔为条件,抽取资料
时间Wed Feb 8 19:39:12 2017
※ 引述《anakinyen (我在台北 天气晴)》之铭言:
: 遇到一个可能是很新手的问题
: 跳出回圈指令跑完後
: + break
: + }
: Error in as.POSIXct.default(time1) :
: do not know how to convert 'time1' to class “POSIXct”
这问题是你的time1不是时间格式,是character造成的
: > sambar[ , diffTime := NULL]
: Warning message:
: In `[.data.table`(sambar, , `:=`(diffTime, NULL)) :
: Adding new column 'diffTime' then assigning NULL (deleting it).
这个也同理
: 我猜是因为difftime预设的处理资料格式是 hh:mm,没有把日期考虑进去
这个猜测不对,difftime吃的是POSIXct 或是 POSIXlt class的东西
你在用read.csv读入资料的时候,你那个时间格式不会被正确解读成那两个class
所以只会被当成字串处理,因此我下面给你一段程式去把你的时间格式转成POSIXct
: 但我试了半天都没改成功
: 也不太确定我的资料档日期格式是否正确
: 目前格式长这样 2012/11/1 6:04,不知道1号是不是该改成01,6点该改成06 ?
: 再麻烦大大们帮忙了,感谢
资料读入後,请用
library(data.table)
sambar <- read.csv(...)
setDT(sambar)
sambar[ , time1 := as.POSIXct(time1, format = "%Y/%m/%d %H:%M")]
# time1是你的时间变数
: ※ 引述《celestialgod (天)》之铭言:
: : 我用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), 来自: 111.246.24.51
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1486553955.A.05A.html
1F:推 anakinyen: 已加入新的这行指令,但最後还是出现相同的错误讯息@@ 02/08 23:13
str(sambar) 看一下结果是什麽
2F:推 anakinyen: $ Time: POSIXct, format: "2009-12-05 20:00:00" "20 02/08 23:28
一样的错误是这一个吗? Error in as.POSIXct.default(time1)
还是In `[.data.table`(sambar, , `:=`(diffTime, NULL)) :
Adding new column 'diffTime' then assigning NULL (deleting it).
不管是哪个,记得要把下面这段改成你的时间变数名称
DT[ , diffTime := difftime(Time, Time[min(k, .N)], units="hours"), by = ind]
如果改过还是有问题,可能要把你资料给我看一下
3F:推 anakinyen: 两个错误都还是存在,不过把下面的时间变数修正後 02/08 23:43
4F:→ anakinyen: 两个错误都不见了。 02/08 23:45
5F:→ anakinyen: 原来就卡在两个t的大小写。以後得要好好跟R培养感情 02/08 23:46
6F:→ anakinyen: 非常感谢您的帮忙!!! 02/08 23:47
搞定就好
※ 编辑: celestialgod (111.246.24.51), 02/09/2017 00:26:36