子集时间序列,以便选定的行相差一定的最小时间

时间:2017-01-23 22:12:43

标签: r indexing data.table time-series

我在R中使用data.table来存储时间序列。我想返回一个子集,使得所选时间的连续行距离所选择的最后一行至少N秒,例如,如果我有

library(data.table)
x <- data.table(t=c(0,1,3,4,5,6,7,10,16,17,18,20,21), v=1:13)
x
     t  v
 1:  0  1
 2:  1  2
 3:  3  3
 4:  4  4
 5:  5  5
 6:  6  6
 7:  7  7
 8: 10  8
 9: 16  9
10: 17 10
11: 18 11
12: 20 12
13: 21 13

我希望对从第一行开始至少间隔5秒的行进行采样,然后我应该得到一个带有时间/值对的data.table:

y <- x[...something...]
y
     t  v
 1:  0  1
 2:  5  5
 3: 10  8
 4: 16  9
 5: 21 13

时间样本也不必定期间隔,所以我不能只取M行。当然,我可以通过手动循环遍历data.table行来完成此操作,但我想知道是否有更方便的方法来使用data.tables索引来表达它。

1 个答案:

答案 0 :(得分:4)

以下几种方法可以使用滚动连接在子集中查找行集w

t_plus = 5

# one join per row visited
w   <- c()
nxt <- 1L
while(!is.na(nxt)){ 
  w   <- c(w, nxt) 
  nxt <- x[.(t[nxt]+t_plus), on=.(t), roll=-Inf, which=TRUE]
}

# join once on all rows
w0  <- x[.(t+5), on=.(t), roll=-Inf, which=TRUE]

w   <- c()
nxt <- 1L
while (!is.na(nxt)){ 
  w   <- c(w, nxt)
  nxt <- w0[nxt] 
}

然后您可以像x[w]那样进行子集化。

评论

原则上,可能有其他子集满足OP的条件“至少间隔5秒”;这只是通过从第一行向前迭代找到的那个。

第二种方式基于@DavidArenburg's answer与上面链接的Q&amp; A Henrik。虽然问题看起来是一样的,但我无法在这里完全开展工作。

一般来说,在R中循环生成东西是个坏主意(就像我在这里使用w一样)。如果您遇到性能问题,这可能是此代码中需要改进的好方法。