对于许多唯一ID,我为各个日期有多个事件(时间戳)-对于每个ID,我想为每天的第一个事件(当天最早发生的时间)拉一行。
曾尝试使用dplyr
进行分组和过滤,但是还无法为所有ID每天拉出第一个(临时)事件。
示例数据:
df <- data_frame("DateTime" = c("2018-03-04 16:10:00", "2018-03-04 16:15:00",
"2018-03-04 16:30:00", "2018-03-04 16:40:00", "2018-03-05 16:45:00",
"2018-03-07 16:12:00", "2018-03-07 17:00:00", "2018-03-07 18:12:00"),
"ID" = c("A", "A", "B", "B", "B", "C", "C", "C"))
答案 0 :(得分:0)
首先,您需要将DateTime
格式化为日期时间,而不是字符。 lubridate::ymd_hms
对此很有用(假设您的日期是y-m-d)。
接下来,将DateTime
转换为日期。现在,您可以group_by
的ID和日期,然后filter
最少要DateTime
。
最后,一种节省时间的方法是使用strftime
进行格式化。
library(dplyr)
library(lubridate)
df %>%
mutate(DateTime = ymd_hms(DateTime),
Date = as_date(DateTime)) %>%
group_by(Date, ID) %>%
filter(DateTime == min(DateTime)) %>%
ungroup() %>%
mutate(Time = strftime(DateTime, "%H:%M:%S", tz = "UTC"))
结果:
# A tibble: 4 x 4
DateTime ID Date Time
<dttm> <chr> <date> <chr>
1 2018-03-04 16:10:00 A 2018-03-04 16:10:00
2 2018-03-04 16:30:00 B 2018-03-04 16:30:00
3 2018-03-05 16:45:00 B 2018-03-05 16:45:00
4 2018-03-07 16:12:00 C 2018-03-07 16:12:00
答案 1 :(得分:0)
我认为这可以使您到达想要的位置:
library(tidyverse)
df %>%
group_by(ID, lubridate::date(DateTime)) %>%
arrange(DateTime) %>%
slice(1) %>%
ungroup() %>%
select(DateTime, ID)
# A tibble: 4 x 2
DateTime ID
<chr> <chr>
1 2018-03-04 16:10:00 A
2 2018-03-04 16:30:00 B
3 2018-03-05 16:45:00 B
4 2018-03-07 16:12:00 C
答案 2 :(得分:0)
我不确定这是否正确,但是我遇到了类似的问题,我只是按升序排列日期,并使用了distinct()。这似乎只会保留最前面的条目(以防重复的条目)。
在您遇到的问题中,您希望保留最早的记录...因此,仅对数据进行整理并使用distinct即可得到答案。
df %>% arrange(ID, date) %>% distinct(ID, .keep_all = TRUE)