给出下面的数据框
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"))
可用于摆脱第二部分,但如果时间戳很远,则某些测试样本将四舍五入到错误的分钟,从而留下仍然不同的时间戳
答案 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
行分别乘以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
列并保持原样,但是如果您在{{1}中使用round
,则cut
很简单}。另外,如果您想保留第一个条目,例如mutate
,则删除2019-01-27 17:59:53
参数。