Создание отчета из файла необработанных данных / журнала в R - PullRequest
1 голос
/ 06 апреля 2020

Мне нужна помощь для преобразования необработанных данных файла журнала в отчет.

Вот необработанные данные:

Data <- "Date   Generated_Time  User_Name   sas
1   3/24/2020 11:47 EMP1    Login
2   3/24/2020 16:38 EMP1    Login
3   3/24/2020 16:38 EMP1    Logout
4   3/25/2020 2:16  EMP1    Login
5   3/25/2020 2:16  EMP1    Logout
6   3/24/2020 6:51  EMP3    Logout
7   3/24/2020 8:28  EMP3    Login
8   3/24/2020 11:30 EMP3    Logout
9   3/24/2020 21:55 EMP3    Login
10  3/24/2020 23:10 EMP3    Logout
11  3/25/2020 2:34  EMP3    Login
12  3/24/2020 10:05 EMP2    Login
13  3/24/2020 10:18 EMP2    Logout
14  3/24/2020 12:46 EMP2    Login
15  3/24/2020 14:14 EMP2    Logout
16  3/24/2020 17:54 EMP2    Login
17  3/24/2020 19:39 EMP2    Logout
18  3/24/2020 23:15 EMP2    Login
19  3/25/2020 0:18  EMP2    Logout
20  3/25/2020 3:37  EMP2    Login
21  3/25/2020 3:37  EMP2    Logout
22  3/25/2020 3:38  EMP2    Login
"
Data <- read.table(textConnection(
object = Data), 
header = TRUE, 
sep = "", 
stringsAsFactors = FALSE)

Я хотел бы получить вывод, подобный приведенному ниже:

enter image description here

Вот одно предположение:

Если впоследствии время входа / выхода сотрудника не будет найдено, мы будем учитывать время входа и выхода из системы было бы так же.

Буду очень признателен, если вы поможете мне также улучшить логику c. потому что файл журнала состоит из данных за несколько смен.

1 Ответ

2 голосов
/ 06 апреля 2020

Сложной задачей является точное согласование сдвига, как только вы это сделаете, легко выполнить оставшиеся расчеты.

library(dplyr)
library(tidyr)
library(lubridate)

Data %>%
  group_by(User_Name) %>%
  #Thanks to @GGamba for simplification of grp
  mutate(grp = cumsum(sas == 'Login')) %>%
  unite(DateTime, Date, Generated_Time, sep = " ") %>%
  group_by(User_Name, grp) %>%
  complete(sas = c('Login', 'Logout')) %>%
  fill(DateTime, .direction = "updown") %>%
  mutate(DateTime = mdy_hm(DateTime)) %>%
  pivot_wider(names_from = sas, values_from = DateTime) %>%
  ungroup %>%
  mutate(Active_Time = seconds_to_period(Logout - Login))


#   User_Name   grp Login               Logout              Active_Time
#   <chr>     <int> <dttm>              <dttm>              <Period>   
# 1 EMP1          1 2020-03-24 11:47:00 2020-03-24 11:47:00 0S         
# 2 EMP1          2 2020-03-24 16:38:00 2020-03-24 16:38:00 0S         
# 3 EMP1          3 2020-03-25 02:16:00 2020-03-25 02:16:00 0S         
# 4 EMP2          1 2020-03-24 10:05:00 2020-03-24 10:18:00 13M 0S     
# 5 EMP2          2 2020-03-24 12:46:00 2020-03-24 14:14:00 1H 28M 0S  
# 6 EMP2          3 2020-03-24 17:54:00 2020-03-24 19:39:00 1H 45M 0S  
# 7 EMP2          4 2020-03-24 23:15:00 2020-03-25 00:18:00 1H 3M 0S   
# 8 EMP2          5 2020-03-25 03:37:00 2020-03-25 03:37:00 0S         
# 9 EMP2          6 2020-03-25 03:38:00 2020-03-25 03:38:00 0S         
#10 EMP3          1 2020-03-24 06:51:00 2020-03-24 06:51:00 0S         
#11 EMP3          2 2020-03-24 08:28:00 2020-03-24 11:30:00 3H 2M 0S   
#12 EMP3          3 2020-03-24 21:55:00 2020-03-24 23:10:00 1H 15M 0S  
#13 EMP3          4 2020-03-25 02:34:00 2020-03-25 02:34:00 0S 

Мы complete строки, добавив, что из 'Login' или 'Logout' отсутствует. Объедините значения даты и времени, fill значения NA с предыдущими значениями и вычтите значения Login и Logout.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...