R:按时间日期为多个ID选择第一次出现';s
对于许多唯一ID,我有多个单独日期的事件(时间戳)——对于每个ID,我希望为每天的第一个事件(当天最早发生的时间)提取行 已尝试使用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
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超过一行。虽然不太可能……但这在我之前就发生过。我认为,在关系发生的地方,最好了解一下——也就是说,保留关系,以后再处理。