2011-08-30 48 views
1

我有一组数据,如下列:展望未来的数据由n秒设置

TIME,VALUE 
09:00:00.0000000, 5.0 # observation 1 
09:00:00.0002326, 4.0 # observation 2 
... 
09:00:30.0056464, 7.0 # observation n 
... 

我需要能够从目前的观测中查找值30了,做一个差异。例如,对于上面的观察1,我会抓住观察结果n,而我的差异将是7.0 - 5.0 = 2.0。我想对原始集合中的每个观察都做到这一点。

时间值可能不完全相隔三十秒,所以我想要得到最接近三十秒的观察值。它可以略大于三十秒,但不应该少一些。

在R中有没有这样的设计模式,或者有一个代码可以帮助我在“R方式”(基于矢量)中执行此操作的库?

回答

1

使用difflag参数。

diff(your_data$TIME, lag = n) 
+0

,如果我不知道n的值有什么关系吗?有没有办法通过采取当前观察的时间戳,增加30秒,然后检索n? –

0

可能不是最有效的方法,但它会完成工作。

# Create a sequece of time values 
fooDate<-seq(as.POSIXct("2011-01-01 00:00:00",tz="GMT"),as.POSIXct("2011-01-31 00:00:00",tz="GMT"),by="hours") 
# And some fictional data 
fooData<-rnorm(length(fooDate)) 
# Put it into a dataframe 
foo <-data.frame(time=fooDate,data=fooData) 
#Get the start time 
exampleTime<-foo$time[1] 
#A time 34 days in advance 
desiredTime <- exampleTime+60*60*34 
#Which row is it in. 
index <- which(foo$time>=desiredTime) 
#and to get it. 
foo[index[1],2]-foo[1,2] 
1

在一个行:

> which(x-time0>=30)[1] 
[1] 10 

充分说明:

创建一些示例数据。 time0POSIXct日期的向量x中的第一个元素。

> set.seed(1) 
> options(digits.secs=3) 
> basetime <- "2011-08-30 09:00:00" 
> time0 <- as.POSIXct(strptime(basetime, "%Y-%m-%d %H:%M:%S")) 
> x <- time0 + sort(runif(20, 0, 60)) 

减去time0x每个元素。您可以看到第10个元素恰好是第一次大于30s:

> x-time0 
Time differences in secs 
[1] 3.707176 10.593405 12.100916 12.358474 15.930520 22.327434 22.802111 
[8] 23.046223 29.861954 34.371202 37.746843 39.647867 41.221371 43.057111 
[15] 46.190485 46.646713 53.903381 54.492467 56.680516 59.514366 

以下一行代码将对此进行提取。由于日期升序排列,提取子集与x-time0 > 30的第一个元素:

> which(x-time0>=30)[1] 
[1] 10