R - 如果达到特定值则删除行,并重新计算

问题描述 投票:0回答:1

我有一个包含 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")
r dplyr time timestamp
1个回答
0
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.