2017-04-23 65 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