首页 > 解决方案 > 是否有 R 函数以 15 秒的间隔过滤数据集?

问题描述

我正在尝试过滤深度数据和相应日期的数据集。Time 列是 POSIXct format = "%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 秒的间隔,而且显然没有将它们计算在内。

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

谢谢你的帮助!

编辑

@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

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

标签: rtimefiltersequenceintervals

解决方案


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

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))

感谢您的所有帮助!


推荐阅读