Удалить повторяющиеся события в течение времени дельты - PullRequest
1 голос
/ 25 апреля 2019

С учетом приведенного ниже кадра данных

  class           timestamp
1     A 2019-02-14 15:00:29
2     A 2019-01-27 17:59:53
3     A 2019-01-27 18:00:00
4     B 2019-02-02 18:00:00
5     C 2019-03-08 16:00:37

наблюдения 2 и 3 указывают на одно и то же событие.Как удалить строки, принадлежащие к одному и тому же классу, если другая метка времени в течение 2 минут уже существует?

Требуемый вывод:

  class           timestamp
1     A 2019-02-14 15:00:00
2     B 2019-01-27 18:00:00
3     A 2019-02-02 18:00:00
4     C 2019-03-08 16:00:00

round( ,c("mins")) можно использовать для избавления от второго компонентано если временные метки находятся далеко, некоторые тестовые образцы будут округлены до неправильной минуты, оставляя все еще разные временные метки

1 Ответ

2 голосов
/ 25 апреля 2019

РЕДАКТИРОВАТЬ

Я думаю, что я слишком усложнил проблему с первой попытки, я думаю, что для вашего случая будет полезно округлить время для 2-минутных интервалов, которые мы можем сделать, используя round_date от lubridate.

library(lubridate)
library(dplyr)

df %>%
  mutate(timestamp = round_date(as.POSIXct(timestamp), unit = "2 minutes")) %>%
  group_by(class) %>%
  filter(!duplicated(timestamp))

# class timestamp          
#  <chr> <dttm>             
#1 A     2019-02-14 15:00:00
#2 A     2019-01-27 18:00:00
#3 B     2019-02-02 18:00:00
#4 C     2019-03-08 16:00:00

Исходная попытка

Сначала можно преобразовать объект timestamp в POSIXct, затем строки arrange на class иtimestamp, используйте cut, чтобы разделить их на интервал "2 min", а затем удалите дубликаты.

library(dplyr)

df %>%
 mutate(timestamp = as.POSIXct(timestamp)) %>%
 arrange(class, timestamp) %>%
 group_by(class) %>%
 filter(!duplicated(as.numeric(cut(timestamp, breaks = "2 mins")), fromLast = TRUE))


# class timestamp          
#  <chr> <dttm>             
#1 A     2019-01-27 18:00:00
#2 A     2019-02-14 15:00:29
#3 B     2019-02-02 18:00:00
#4 C     2019-03-08 16:00:37

Здесь я не изменил или не округлил столбец timestamp и сохранил его как есть.но было бы просто round, если вы используете cut в mutate.Также, если вы хотите сохранить первую запись, например, 2019-01-27 17:59:53, удалите аргумент fromLast = TRUE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...