R:按时间日期选择多个ID的首次出现

时间:2019-02-04 23:19:38

标签: r

对于许多唯一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"))

3 个答案:

答案 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)