【问题标题】:is there an R function to filter a dataset in 15 secs interval?是否有 R 函数以 15 秒的间隔过滤数据集?
【发布时间】:2020-01-05 15:54:33
【问题描述】:

我正在尝试过滤深度数据和相应日期的数据集。 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列里

【问题讨论】:

  • 对 diff 的 cumsum 进行模除。
  • 你好,如果你能提供一个可复制的代码就好了(你可以使用dput作为你的示例数据集)。因为没有人愿意手动复制您提供的所有数据..

标签: r time filter sequence intervals


【解决方案1】:

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

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

感谢您的所有帮助!

【讨论】:

  • 看起来不错 - 我认为您想在过滤和调用 issecsApart 函数之前按时间安排正确吗? (刚刚编辑)
【解决方案2】:

一个潜在的解决方案是使用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

Filter rows by a time threshold

Subset observations that differ by at least 30 minutes time

Subset time series so that selected rows differs by a certain minimum time

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

【讨论】:

  • 非常感谢你们!我在考虑 cumsum 但不知道如何合并 15!这在大多数数据上运行良好,但似乎更高的差异正在困扰它。
  • @Ninaninanska 你能分享可能不起作用的示例数据吗?你会得到什么结果?
  • 我在原来的问题上加了一些
  • @Ninaninanska 感谢您提供更多信息 - 我会尽快跟进(仍在编辑)。很高兴您找到了解决方案!
猜你喜欢
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
相关资源
最近更新 更多