r - 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 分钟时重新设置。
任何想法?
解决方案
这是一个解决方案,带有一个很好的旧 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]
}
}
推荐阅读
- database - 数据结构 - 根据待处理的操作对记录进行优先级排序
- python - 有没有更好的方法来为 Python 实现一个通用的“变化”习语?
- amazon-web-services - aws 网络负载均衡器有时会通过 aws transfer 系列返回“服务不可用”
- django - ValueError:使用 Docker、django-pipeline、whitenoise 在 Heroku 上缺少静态文件清单条目
- python - 如何将二进制字符串传输回原始文件格式(不仅仅是解码内容)
- azure - Spring Boot RestTemplate 不适用于 Azure 函数
- video - 自动检测视频源中烧录字幕的框/坐标
- .net - 迁移到 .Net 5 后出现 AESManaged 错误
- angular - Treeshakeable 提供了In-Syntax,同时将服务接口与实现分开
- javascript - 如何结合渲染和作曲家?