gpt4 book ai didi

r - 对时间序列进行子集化,以便选定的行在某个最小时间上有所不同

转载 作者:行者123 更新时间:2023-12-01 00:35:09 25 4
gpt4 key购买 nike

我在 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 索引来表达这一点。

最佳答案

以下是使用滚动连接查找行集的几种方法,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到上面链接的问答亨里克。尽管问题似乎相同,但我无法在这里完全采用这种方法。

一般来说,在 R 中循环增长是一个坏主意(就像我在这里用 w 做的那样)。如果您遇到性能问题,这可能是改进此代码的好地方。

关于r - 对时间序列进行子集化,以便选定的行在某个最小时间上有所不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41816629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com