首页 > 解决方案 > r - 一组观测值的时间间隔自适应划分

问题描述

我有一个与时间相关的动物观察数据框,我需要将它们分配到不同的组,具体取决于 obs 是否相距 10 分钟。但是,使用固定的 10 分钟时间划分并不理想。我的 df 看起来像这样:

             DateTime Total_Adults Site    Species  Group_equal_int Group_ideal
  2016-05-28 18:29:14            1   1A wildebeest                1           1
  2016-05-28 18:29:53            1   1A wildebeest                1           1
  2016-05-28 18:30:02            1   1A wildebeest                1           1
  2016-05-28 18:37:56            1   1A wildebeest                1           1
  2016-05-28 18:45:03            1   1A wildebeest                2           2
  2016-05-28 18:50:24            1   1A wildebeest                3           2
  2016-05-28 18:50:40            2   1A wildebeest                3           2
  2016-05-28 18:58:52            1   1A wildebeest                3           3
  2016-05-28 18:59:25            1   1A wildebeest                4           3
  2016-05-28 18:59:41            2   1A wildebeest                4           3

如果相隔 10 分钟,则该观察被认为是独立的,否则这两个 obs 被视为同一动物。

一个简单的解决方案是将时间序列划分为从第一个 obs 开始的 10 分钟括号;

interval <- seq.POSIXt(from = min(df$DateTime), to = max(df$DateTime), by = 600)
df$Group_equal_int <- findInterval(df$DateTime, vec = interval)

我不喜欢;只要观察间隔小于 10 分钟,这种划分就是连贯的。一旦连续 obs 与前一个 obs 相距超过 10 分钟,则首先选择的时间间隔有可能落在应视为单个 obs 的一组 obs 的中间(两个 obs 之间的时间小于 10 分钟)第一个和最后一个)并将其计为两个obs。与 group_ideal 相比,我展示了 Group_equal_int 中发生的情况。

我需要以一种可以解释这一点的方式划分我的数据集的时间,但我不知道如何让 10 分钟休息的起点在每次两个 obs 相距超过 10 分钟时重新设置。

任何想法?

标签: rdataframetime-series

解决方案


这是一个解决方案,带有一个很好的旧 for 循环:

df$difftime <- c(0, diff(df$DateTime)/60)

df$group <- 1
time_in_group <- 0
for (i in seq.int(2, nrow(df))) {
    time_in_group <- time_in_group + df$difftime[i]
    if(time_in_group < 10)
        df$group[i] <- df$group[i-1]
    else {
        time_in_group <- 0
        df$group[i] <- 1 + df$group[i-1]
    }
}

推荐阅读