是否有 R 函数可以在 15 秒的间隔内筛选数据集?



我正在尝试过滤深度数据和相应日期的数据集。 "时间"列是 POSIXctformat = "%Y%m%d%H%M%S"。 这是我的数据的样子:

Depth Time        
0.1   2018-06-24 01:26:40  
0.2   2018-06-24 01:26:41  
0.2   2018-06-24 01:26:56  
0.1   2018-06-24 01:26:57  
0.1   2018-06-24 01:26:58  
0.1   2018-06-24 01:26:59  
0.1   2018-06-24 01:27:14  
0.1   2018-06-24 01:27:15  
0.1   2018-06-24 01:27:16  
0.1   2018-06-24 01:27:17  
0.1   2018-06-24 01:27:30  

我想创建一个包含相同数据的数据帧,但每 15 秒只有一个新条目。我的数据有时是连续的,有时记录的时间有间隙。

这将是我想要的输出:

深度时间 0.2 2018-06-24 01:26:41 0.2 2018-06-24 01:26:56 0.1 2018-06-24 01:27:14 0.1 2018-06-24

01
:27:30

我尝试使用行之间的时间差,它适用于连续数据集的部分:

dt_filter <- d_cor %>%  
mutate(diff = Time - lag(Time, default = first(Time)))  
if ((dt_filter$diff < 2) ) {  
dt_filter_1 <- dt_filter[seq(1, nrow(dt_filter), 15), ]  
}

但是一旦我尝试添加不连续的那些,这就会给我带来一个问题:

dt_filter_15 <- dt_filter %>%    
filter(diff >= 15 )

从那以后,我并不总是有 15 秒的间隔,而且显然不将它们计算在内。

到目前为止,我找不到能够过滤时间列的函数。我很陌生,所以不太熟悉编写自己的循环,我想这是必要的......时间数据并没有使它变得更容易。

感谢您的任何帮助!

编辑

@Ben 感谢您的快速回复!

这是我得到的一些输出:

Depth Time                diff cumdiff x
0.1   2018-06-23 23:59:44 1    1030    0
0.0   2018-06-24 00:01:02 78   1035    5
0.0   2018-06-24 00:01:03 1    1036    1

最后两行之间只有 1 的差异,但它仍然被添加到 cumdiff 中,因此计入 x 列

感谢您的链接,我发现该功能似乎运行良好 - 以防万一有人有同样的问题:

issecsApart <- function(d_cor) {
secs <- 0
keeps <- c()
for (d in d_cor) {
if (d >= secs + 15) {
secs <- d
keeps <- c(keeps, TRUE)
} else {
keeps <- c(keeps, FALSE)
}
}
keeps
}
d_cor2 <- d_cor %>% 
arrange(Time) %>%
filter(issecsApart(Time))

感谢您的所有帮助!

一个潜在的解决方案是使用dplyr- 尽管我相信可能有更好的选择,尤其是data.table.正如@42-建议并由@Maurits Evers演示的那样,您可以执行以下操作:

library(dplyr)
d_cor %>%
arrange(Time) %>%
mutate(
diff = abs(lag(Time) - Time),
diff = ifelse(is.na(diff), 0, diff),
cumdiff = cumsum(diff) %/% 15,
x = abs(lag(cumdiff) - cumdiff)) %>%
filter(is.na(x) | x > 0) %>%
select(Depth, Time)
Depth                Time
1   0.1 2018-06-24 01:26:40
2   0.2 2018-06-24 01:26:56
3   0.1 2018-06-24 01:27:14
4   0.1 2018-06-24 01:27:30

diff将包括连续行之间的时间差异(以秒为单位(。第一行将为NA(更改为 0(。

cumdiffdiff的累积和,但在取模除以15之后(cumdiff至少每15秒增加1

(。过滤器将包括第一行 (x = NA( 和cumdiff更改的其他行(在至少经过 15 秒的行处(。

其他可能有用的示例包括data.table

按时间阈值筛选行

相差至少 30 分钟时间的子集观测值

子集时间序列,以便所选行相差某个最小时间

编辑:此解决方案在固定的15秒窗口中查找时间。存在与大于 15 的差异相关的问题。对于这些情况,它不会"重置"并启动新的 15 秒窗口。相反,无论它在哪个 15 秒窗口,它都会包括该时间。正因为如此,我们可能会发现彼此接近的时间,尤其是在之后。

最新更新