2012-07-29 59 views
4

我有时间序列和值的数据帧。时间序列是从时代开始的秒数。这里是顶级的几个要素看怎么样在该数据帧在数据帧上的时间间隔搜索

val = seq(1,19) 
ts = seq(1342980888,1342982000,by=60) 
x = data.frame(ts = ts,val = val) 
head(x) 

     ts val 
1 1342980888 1 
2 1342980948 2 
3 1342981008 3 
4 1342981068 4 
5 1342981128 5 
6 1342981188 6 

我想某种间隔搜索功能的它接受作为输入时间戳说1342980889(+1中第一TS行),它应该返回1,2(行号)作为输出。基本上,我想找到两个有时间戳的行,它们包含输入时间戳1342980889.虽然使用“哪个”相对容易,但是我怀疑“哪个”做了矢量扫描,而且真正的数据帧是相当的大我想要使用二进制搜索。非常感谢

回答

5

您应该使用findInterval函数。它会给你在哪里x$ts立即比你正在寻找的值越小行的索引(你只需要添加一个让其他指数)

findInterval(1342980889, x$ts) 
# [1] 1 

还要注意的是功能被矢量,即,第一个参数可以是要查找的值的向量:

findInterval(c(1342980889, 1342981483), x$ts) 
# [1] 1 10 
+0

这很好。搜索是否发生在log(N)时间? – broccoli 2012-07-29 01:04:23

+0

那么,帮助页面的详细信息部分将讨论复杂性。 – flodel 2012-07-29 01:15:21

+0

对于要搜索的单个值,是,O(log(N))。更一般地说,如果你的第一个输入是一个长度为n的向量,那么它就是O(n * log(N)),如果这个向量是排序的,那么它就是O(n)。 – flodel 2012-07-29 11:00:35