在增量时间内删除重复的事件

时间:2019-04-25 08:20:23

标签: r

给出下面的数据框

  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 个答案:

答案 0 :(得分:2)

编辑

我认为我在第一次尝试中就使问题复杂化了,我认为对您的情况有用的是将时间间隔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行分别乘以classtimestamp,使用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列并保持原样,但是如果您在{{1}中使用round,则cut很简单}。另外,如果您想保留第一个条目,例如mutate,则删除2019-01-27 17:59:53参数。