我有一个包含 GPS 点的数据集,我想删除 2 小时内的点。这是数据集的示例:
gps_data_animals_id acquisition_time
348179 348179 2015-09-18 00:00:00
348180 348180 2015-09-18 01:45:00
348181 348181 2015-09-18 02:00:00
348182 348182 2015-09-18 02:15:00
348183 348183 2015-09-18 02:30:00
348184 348184 2015-09-18 04:30:00
348185 348185 2015-09-18 04:45:00
348186 348186 2015-09-18 05:00:00
348187 348187 2015-09-18 06:00:00
348188 348188 2015-09-18 12:00:00
348189 348189 2015-09-18 17:15:00
348190 348190 2015-09-18 17:30:00
348191 348191 2015-09-18 17:45:00
348192 348192 2015-09-18 18:00:00
348193 348193 2015-09-18 18:15:00
348194 348194 2015-09-18 18:30:00
348195 348195 2015-09-18 18:45:00
348196 348196 2015-09-19 00:00:00
348197 348197 2015-09-19 06:01:00
348198 348198 2015-09-19 11:15:00
我希望位置在时间上间隔至少 2 小时,所以这将是过滤后的数据集:
gps_data_animals_id acquisition_time
348179 348179 2015-09-18 00:00:00
348181 348181 2015-09-18 02:00:00
348184 348184 2015-09-18 04:30:00
348188 348188 2015-09-18 12:00:00
348189 348189 2015-09-18 17:15:00
348196 348196 2015-09-19 00:00:00
348197 348197 2015-09-19 06:01:00
348198 348198 2015-09-19 11:15:00
我一直在使用
lag()
函数,因为它似乎或多或少地完成了我需要的功能,但最终我删除了超出我想要的内容。这就是我到目前为止所做的:
dataset$time_diff <- unlist(tapply(dataset$acquisition_time, INDEX = dataset$animals_id,
FUN = function(x) c(0, `units<-`(diff(x), "hours"))))
然后我会删除那些小于 2 小时的 time_diff 值,但这最终会删除比我想要的更多的值,因为它也会删除例如
gps_data_animals_id = 348181
,我想保留它,因为它与第一个位置有 2 小时的间隔。
我认为它可以工作:顺序选择前两行,计算时间差,如果时间差小于2小时,则删除第二行。然后再次将前两行分组并重复该过程。但我不知道如何从代码角度做到这一点。
有什么想法吗?
这是数据集的可重现示例:
structure(list(gps_data_animals_id = 348179:348198, acquisition_time = structure(c(1442534400,
1442540700, 1442541600, 1442542500, 1442543400, 1442550600, 1442551500,
1442552400, 1442556000, 1442577600, 1442596500, 1442597400, 1442598300,
1442599200, 1442600100, 1442601000, 1442601900, 1442620800, 1442642460,
1442661300), class = c("POSIXct", "POSIXt"), tzone = "GMT")), row.names = 348179:348198, class = "data.frame")
library(dplyr)
dat %>%
mutate(time = c(NA, diff(acquisition_time))) %>%
filter(time >= 120) %>%
select(-time)
gps_data_animals_id acquisition_time
348179 348179 2015-09-18 00:00:00
348181 348181 2015-09-18 02:00:00
348184 348184 2015-09-18 04:30:00
348188 348188 2015-09-18 12:00:00
348189 348189 2015-09-18 17:15:00
348196 348196 2015-09-19 00:00:00
348197 348197 2015-09-19 06:01:00
348198 348198 2015-09-19 11:15:00