РЕДАКТИРОВАТЬ
Я думаю, что я слишком усложнил проблему с первой попытки, я думаю, что для вашего случая будет полезно округлить время для 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
.