2017-04-23 67 views
0

我有两个大型数据集,一个名为Shifts,它包含一个班次内的个人开始和结束时间(ID)。的数据是如何构成的一个小例子:如何在一段时间内查找时间并返回另一列值?

> head(Shifts, 15) 
    ID  Shift Rotation  Start     End 
1  A  S1  1 2017-04-23 00:05:58 2017-04-23 00:24:40 
2  A  S2  2 2017-04-23 00:00:00 2017-04-23 00:10:08 
3  A  S2  3 2017-04-23 00:15:13 2017-04-23 00:27:32 
4  A  S3  4 2017-04-23 00:00:00 2017-04-23 00:20:43 
5  A  S3  5 2017-04-23 00:27:49 2017-04-23 00:33:28 
6  A  S4  6 2017-04-23 00:04:26 2017-04-23 00:31:37 
7  B  S1  1 2017-04-23 00:00:00 2017-04-23 00:11:56 
8  B  S1  2 2017-04-23 00:13:42 2017-04-23 00:29:10 
9  B  S2  3 2017-04-23 00:03:38 2017-04-23 00:24:28 
10  B  S3  4 2017-04-23 00:00:00 2017-04-23 00:27:36 
11  B  S3  5 2017-04-23 00:31:08 2017-04-23 00:33:28 
12  B  S4  6 2017-04-23 00:00:01 2017-04-23 00:14:26 
13  B  S4  7 2017-04-23 00:18:32 2017-04-23 00:31:37 
14  C  S1  1 2017-04-23 00:00:00 2017-04-23 00:29:10 
15  C  S2  2 2017-04-23 00:00:00 2017-04-23 00:19:28 

其他数据集(Activities)包含通过在各移位个人(ID)完成时间戳的工作活动(Symbol)。此数据集的一个小例子:

> head(Activity, 10) 
    ID Symbol Shift   Time 
1 B  TE  S1 2017-04-23 00:00:22 
2 B  TI  S1 2017-04-23 00:00:24 
3 C  TE  S1 2017-04-23 00:01:08 
4 A  TE  S1 2017-04-23 00:06:08 
5 B  TE  S1 2017-04-23 00:01:25 
6 B  P  S1 2017-04-23 00:01:33 
7 C  P  S1 2017-04-23 00:01:36 
8 C  T  S1 2017-04-23 00:01:36 
9 A  T  S1 2017-04-23 00:07:45 
10 A  T  S1 2017-04-23 00:08:25 

对于每个ID上每个班次,现在我想如果Activities$Time来查找时间间隔Shifts$StartShifts$End然后返回相应Shift$Rotation柱内。我的预期输出是:

> head(Activity, 10) 
    ID Symbol Shift   Time  Rotation 
1 B  TE  S1 2017-04-23 00:00:22  1 
2 B  TI  S1 2017-04-23 00:00:24  1 
3 C  TE  S1 2017-04-23 00:01:08  1 
4 A  TE  S1 2017-04-23 00:06:08  1 
5 B  TE  S1 2017-04-23 00:01:25  1 
6 B  P  S1 2017-04-23 00:01:33  1 
7 C  P  S1 2017-04-23 00:01:36  1 
8 C  T  S1 2017-04-23 00:01:36  1 
9 A  T  S1 2017-04-23 00:07:45  1 
10 A  T  S1 2017-04-23 00:08:25  1 

由于这两个数据集是相当大的,有许多的ID,班次和循环,有没有快速的方法来查找并返回此列按照上面的?

谢谢。

回答

1

如何如下:

library(tidyverse) 
library(lubridate) 

Activity <- inner_join(Shifts, Activities, by = c("ID", "Shift")) %>% 
    mutate(
    temp = (Start < Time) * (Time < End) 
) %>% 
    filter(temp == 1) %>% 
    select(ID, Symbol, Shift, Time, Rotation) 
+0

谢谢,但是我收到以下错误信息:'加入,通过= C( “ID”, “移位”, “开始”, “结束”) 警告消息: 1:所有格式均无法解析。找不到格式。 2:所有格式解析失败。找不到格式。 3:所有格式解析失败。找不到格式。 4:所有格式解析失败。找不到格式。 ' – user2716568

+0

@ user2716568什么时候是什么类的列(即'class(Shifts $ Start)')?我认为这是错误的根源。 –

+0

时间栏的类别为:班级(班次$ Start) [1]“POSIXct”“POSIXt” >班级(班次$ End) [1]“POSIXct”“POSIXt” > class(IActivities $ Time) [1]“POSIXct”“POSIXt”' – user2716568

相关问题