我有一组数据如下:
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
...
我需要能够从当前观察中查找出三十分的值并做出改变。例如,对于上面的观察1,我会抓住观察n,我的差异将是7.0 - 5.0 = 2.0。我想为原始集合中的每个观察做到这一点。
时间值可能不会相隔三十秒,所以我想得到最接近三十秒的观察值。它可能略大于30秒,但它应该不会少。
R中是否有这样的设计模式,或者有一个代码可以帮助我以“R方式”(基于矢量)执行此操作的库?
答案 0 :(得分:1)
将diff
与lag
参数一起使用。
diff(your_data$TIME, lag = n)
答案 1 :(得分:1)
在一行中:
> which(x-time0>=30)[1]
[1] 10
完整的解释:
创建一些示例数据。 time0
是x
日期的POSIXct
向量中的第一个元素。
> 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))
从time0
的每个元素中减去x
。你可以看到第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
答案 2 :(得分: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]