我有动物追踪的一些数据,我想转换它们以便使用模型。 发射器每小时发送一次该位置,但有时我几个小时没有数据。我将使用的模型假设点在时间上是等间隔的。
我想找到一种方法从数据的第一个小时开始,然后在4小时后选择值,依此类推。 如果那时没有价值: 1)查看是否有一个(或2)小时的值或更早的值并采取它(为了避免过多的NA,见下文)。 如果还没有: 2)在所需时间包含一行,其中NA为共变量,并从那一点开始一次又一次地重新启动,直到检查了5000行。
由于我不知道动物使用的时间步数,我希望能够尝试不同的值(例如每6小时+或 - 2小时)。
以下是我的数据示例:
tab <- data.frame(Date = c("2015-04-27 02:28:00","2015-04-27 03:11:00","2015-04-27 05:16:00","2015-04-27 09:22:00","2015-04-27 10:10:00","2015-04-27 16:14:00","2015-04-27 17:29:00"),
ID = c("DD1","DD1","DD1","DD1","DD1","DD1","DD1"),
covar= c(1,2,3,4,5,6,7))
>tab
Date ID covar
2015-04-27 02:28:00 DD1 1
2015-04-27 03:11:00 DD1 2
2015-04-27 05:16:00 DD1 3
2015-04-27 09:22:00 DD1 4
2015-04-27 10:10:00 DD1 5
2015-04-27 16:14:00 DD1 6
2015-04-27 17:29:00 DD1 7
这就是我想要获得的:
>regTab4h
Date ID covar
2015-04-27 02:28:00 DD1 1 # keep this one at it is the first
# Drop this one (less than 4h interval)
2015-04-27 05:16:00 DD1 3 # Normal time would be 06 hours but 05h is in the 1h interval
2015-04-27 09:22:00 DD1 4 # 5 + 4 = 9 so this is perfect keep this one
# No longer needed
2015-04-27 13:00:00 NA NA # Create a NA here because there is no value at the time 13:00:00 + or - 1h
# drop 16:00:00 because 13+4 = 17 and we have it
2015-04-27 17:29:00 DD1 7
我尝试按照这篇文章中的方法进行操作:Creating regular 15-minute time-series from irregular time-series 但是当存在大的差距时,它不允许具有“NA”
为了简化数据,我将它们四舍五入到最接近的小时,并在xts对象中进行转换。
tab$Date=round.POSIXt(as.POSIXct(as.character(tab$Date)),units="hours")
x <- xts(tab[,-1],order.by =as.POSIXct((tab$Date)))
然后我没有成功尝试:
library(hydroTSM)
x2=to.period(x,period = "hours", k=4, OHLC = FALSE)
x3=as.zoo(x2)
x4=izoo2rzoo(x3, from= start(x), to= end(x), date.fmt= "%Y-%m-%d %H:%M:%S", tstep= "hours",k=4)
任何帮助将不胜感激!
我希望我没有错过一个明显的方法来做到这一点...... 我想循环可以完成这项工作,但我不知道如何制定它。