Создайте аккуратные данные в R с метками времени, основанными на «размере» временной метки - PullRequest
0 голосов
/ 28 марта 2019

Я провожу анализ изменений времени цикла для каждого из наших процессов, связанных с различными продуктами, которые мы производим. Наши данные SAP содержат записи журнала начала и окончания работника, и цель состоит в том, чтобы рассчитать время цикла с этой информацией.

Однако SAP экспортирует метки времени начала и окончания в одном столбце, и нет доступного справочного столбца с указанием того, что является временем начала и времени окончания. Это приводит в порядок данные, например, распространение невозможно.

Текущие данные

  • 1,6 миллиона строк
  • 150 Операции
  • 10 тысяч заказов

. Небольшая выборка данных выглядит следующим образом.

Order <-  rep(c(1059866,1059891),each = 4)
Operation <- rep(c(1510,1550),4)
Timestamp <- c("30-11-2016 07:33:30", "30-11-2016 07:33:42", "30-11-2016 16:00:13", "30-11-2016 16:00:18", "30-11-2016 07:35:21", "30-11-2016 07:35:43", "30-11-2016 16:00:43", "30-11-2016 16:00:39")

df_current <- cbind(Order, Operation, Timestamp)

Эта информация о начале и завершении требуется для каждого шага процесса («Операция»). Логически самая ранняя временная метка - это запись в журнале начала, а самая последняя временная метка - это запись в журнале завершения.

Однако я не могу понять, как сказать R создать новый столбец, который правильно указывает, какая отметка времени начинается и заканчивается на основе отметки времени.

Требуемые данные

Order <-  rep(c(1059866,1059891),each = 4)
Operation <- rep(c(1510,1550),4)
Timestamp <- c("30-11-2016 07:33:30", "30-11-2016 07:33:42", "30-11-2016 16:00:13", "30-11-2016 16:00:18", "30-11-2016 07:35:21", "30-11-2016 07:35:43", "30-11-2016 16:00:43", "30-11-2016 16:00:39")
Status <- c("Start" , "Finish", "Start" , "Finish", "Start" , "Finish",  "Finish", "Start")   

df_desired <- cbind(Order, Operation, Timestamp, Status)

Когда данные выглядят так, я могу легко привести в порядок данные.

Спасибо

Ответы [ 2 ]

1 голос
/ 28 марта 2019

с dplyr


library(dplyr)


  df_current %>% as.data.frame() %>%
    group_by(Operation, Order) %>%
    mutate(Timestamp = as.POSIXct(Timestamp, format = "%d-%m-%Y %H:%M:%S"),
           Status = case_when(Timestamp == min(Timestamp) ~ "Start",
                              TRUE ~ "Finish")) %>%
    arrange(Order, Operation)


# A tibble: 8 x 4
# Groups:   Operation, Order [4]
  Order   Operation Timestamp           Status
  <fct>   <fct>     <dttm>              <chr> 
1 1059866 1510      2016-11-30 07:33:30 Start 
2 1059866 1510      2016-11-30 16:00:13 Finish
3 1059866 1550      2016-11-30 07:33:42 Start 
4 1059866 1550      2016-11-30 16:00:18 Finish
5 1059891 1510      2016-11-30 07:35:21 Start 
6 1059891 1510      2016-11-30 16:00:43 Finish
7 1059891 1550      2016-11-30 07:35:43 Start 
8 1059891 1550      2016-11-30 16:00:39 Finish

также, поскольку ваши данные довольно большие: data.table

library(data.table)

dfc_2 <- as.data.frame(df_current)

dfc_2$Timestamp <- as.POSIXct(Timestamp, format = "%d-%m-%Y %H:%M:%S")

setDT(df_curr)[, Status := ifelse(Timestamp == min(Timestamp), "Start", "Finish"),
               keyby = .(Operation, Order)] 
1 голос
/ 28 марта 2019

Предполагая, что вы можете преобразовать свои данные в data.frame вместо matrix:

df_current <- data.frame(Order, Operation, Timestamp)

df.With.Status <- do.call(rbind, #rbind the dataframes to a big dataframe
lapply(split(df_current,list(df_current$Order,df_current$Operation)), #split dataframe by unique order/operation combinations and apply function for each combination
       function(df){
         df$Timestamp <- strptime(rev(as.character(df$Timestamp)),format="%d-%m-%Y %H:%M:%S") #Convert to Time, so that it is sortable
         df <- df[order(df$Timestamp),] # rearrange the dataframe in case of wrong order
         df$Status <- c("Start","Finish") #add status
         return(df)
       }))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...