R:按时间日期为多个ID选择第一次出现';s

R:按时间日期为多个ID选择第一次出现';s,r,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

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

df首先,您需要将
DateTime
格式化为日期时间,而不是字符<代码>lubridate::ymd_hms
在这方面很有用(假设您的日期是y-m-d)

接下来,将日期时间转换为日期。现在,您可以按ID和日期对您进行分组,然后对进行筛选以获得最短的
DateTime

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"))
最后,获取时间的一种方法是使用
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
#一个tible:4 x 4
日期时间ID日期时间
2018-03-04 16:10:00 A 2018-03-04 16:10:00
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

首先,您需要将
日期时间
格式化为日期时间,而不是字符<代码>lubridate::ymd_hms在这方面很有用(假设您的日期是y-m-d)

接下来,将日期时间转换为日期。现在,您可以按ID和日期对您进行分组,然后对进行筛选以获得最短的
DateTime

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"))
最后,获取时间的一种方法是使用
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
#一个tible:4 x 4
日期时间ID日期时间
2018-03-04 16:10:00 A 2018-03-04 16:10:00
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

我想这会让你达到你想要的目标:

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  
库(tidyverse)
df%>%
分组人(ID,lubridate::date(DateTime))%>%
安排(日期时间)%>%
切片(1)%>%
解组()%>%
选择(日期时间,ID)
#一个tibble:4x2
日期时间ID
2018-03-04 16:10:00A
2018-03-04 16:30:00 B
3 2018-03-05 16:45:00 B
4 2018-03-07 16:12:00摄氏度

我想这会让你达到你想要的目标:

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  
库(tidyverse)
df%>%
分组人(ID,lubridate::date(DateTime))%>%
安排(日期时间)%>%
切片(1)%>%
解组()%>%
选择(日期时间,ID)
#一个tibble:4x2
日期时间ID
2018-03-04 16:10:00A
2018-03-04 16:30:00 B
3 2018-03-05 16:45:00 B
4 2018-03-07 16:12:00摄氏度

我不确定这是否是正确的方法,但我遇到了类似的问题,我只是按升序排列日期,并使用distinct()。这似乎只保留顶部条目(以防有重复条目)

在您的问题中,您希望保留最早的条目。。。因此,只要整理数据并使用distinct就可以得到答案

df %>% arrange(ID, date) %>% distinct(ID, .keep_all = TRUE)

我不确定这是否是正确的方法,但我有一个类似的问题,我只是按升序排列日期,并使用distinct()。这似乎只保留顶部条目(以防有重复条目)

在您的问题中,您希望保留最早的条目。。。因此,只要整理数据并使用distinct就可以得到答案

df %>% arrange(ID, date) %>% distinct(ID, .keep_all = TRUE)

谢谢,但这只是答案的一半-你的解决方案将只拉最短的日期/时间-我想要每天的最短时间。。。有什么想法吗?哦,我想我已经解决了-将DateTime拆分为单独的列,然后稍微添加到您拥有的内容中:df%>%groupby(ID,Date)%%>%filter(Time==min(Time))%%>%ungroup()已编辑。希望它能让你更接近你所需要的。只需注意-如果一天中的第一个事件与另一个事件同时发生,这可能会导致每天每个ID超过一行。虽然不太可能……我以前也遇到过这种情况,但我认为,在关系发生的地方,最好了解一下——也就是说,保留关系,以后再处理。谢谢,但这只是答案的一半——你的解决方案只会拖最短的日期/时间——我想要每天的最短时间。。。有什么想法吗?哦,我想我已经解决了-将DateTime拆分为单独的列,然后稍微添加到您拥有的内容中:df%>%groupby(ID,Date)%%>%filter(Time==min(Time))%%>%ungroup()已编辑。希望它能让你更接近你所需要的。只需注意-如果一天中的第一个事件与另一个事件同时发生,这可能会导致每天每个ID超过一行。虽然不太可能……但这在我之前就发生过。我认为,在关系发生的地方,最好了解一下——也就是说,保留关系,以后再处理。