2016-11-03 3 views
-6

У меня есть некоторые данные о конкретных заданиях; важными частями являются время начала и время окончания каждой конкретной работы. Я хотел бы построить агрегированный (счет) одновременных заданий с осью x, являющейся временем и осью Y, числом заданий, выполняемых в этот конкретный момент времени.Как построить число одновременных рабочих заданий в любой момент времени

Поскольку я начинаю с R, я начал с некоторых шагов предварительной обработки, таких как объединение столбцов даты и времени, преобразование в POSIXlt, вычисление timediffs() и так далее. Теперь я застрял. Мне не нужен код, но я был бы признателен за любой намек, как это реализовать.

В частности, я не знаю, как использовать время обработки задания в качестве процесса, а не только с помощью начальной точки

Это вот мой кадр данных:

'data.frame': 10000 obs. of 7 variables: 
$ Process_name   : Factor 
$ Process_start  : POSIXlt, format: "2009-12-23 03:44:38" 
$ Process_end   : POSIXlt, format: "2009-12-23 03:44:42" 
$ Process_duration(s) : Class 'difftime' atomic [1:10000] 4 75 1 2 1 
$ ProcessIncludedInJob : Factor 

Я хочу знать сколько заданий выполняется в определенный момент времени одновременно. Работа - это процесс, который работает некоторое время. Во время выполнения другого задания может запускаться и запускаться одновременно, например. Я хочу рассчитать и построить это обстоятельство для дальнейшего анализа. Мой первый подход заключался в том, чтобы нарисовать дату на x и, например, использовать либо startdate, либо enddate для оси y. Но так как каждая работа - это своего рода процесс, а не только момент времени (начало или конец), я не могу видеть, сколько заданий выполняется одновременно. Поэтому я предполагаю, что я должен каким-то образом использовать столбец Jobstart и столбец Jobduration.

+2

Вы получаете кучу голосов, потому что вы не включили никого, кто мог бы дать ответ на ваш вопрос. Используйте 'dput()' для вывода ваших данных в формате, который мы можем легко прочитать в нем как минимум. В идеале вы работаете через подмножество своих данных вручную и показываете нам пример того, какие ваши входы и какие вы хотите. [Это сообщение] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) может помочь вам с другими способами улучшить ваш вопрос. – Barker

+0

Да, пожалуйста, отредактируйте вывод из 'dput (head (df, 10))' в свой вопрос. Тогда мы сможем ... – smci

ответ

1

Я набросок наброски здесь, но нам действительно нужно размещать воспроизводимые данные (пожалуйста!):

  • в любое время т, в num_running_processes = number of started processes - number of ended processes. (Это всегда будет целым числом от 0 до n)
  • который переводится как df$num_running_processes <- sum(Process_start <= t) - sum(Process_end < t). Примечание 'end < t', а не '< ='.

  • Теперь вам не нужно выбирать временной интервал, разделенный на временные интервалы (например, 1 мин или 5 секунд или что-то еще), так как вы знаете, что num_running_processes только когда-либо меняет значение в любое из множества раз либо в Process_start или Process_end.

  • поэтому ваша ось времени может быть установленным соединением: df$t <- union(Process_start, Process_end). У вас есть неравномерная ось времени, и все в порядке. Обратите внимание, что это также вне порядка, т. Е. Новый процесс может начаться до того, как предыдущий закончен. (Мы реорганизовать вещи, заказав dataframe по оси времени)
  • также вычислить другой столбец df$num_running_processes, как описано выше
  • перед вами участка, сортировки или заказать dataframe по оси времени df$t (dplyr библиотека хороша для выполнения этих манипуляции)
+0

, убедитесь, что вы назначили -1 для окончания времени и +1 для начала, сортируйте данные в возрастающий временной порядок, затем просто используйте 'cumsum()' ... –

+1

Да, я сначала подумал об использовании 'cumsum() ', но тогда я понял, что ось времени не соответствует порядку, поэтому нам нужно вычислить всю сумму (Process_start <= t) - sum (Process_end <= t)' в каждой начальной или конечной точке. Итак, альтернативой является преобразование данных в кадр данных с столбцами «Start_Stop» и «time» с событиями «+ 1» (start) и временем начала и «-1» (окончание) событий и конечными точками, изменить порядок данных по времени, а затем вычислить 'df $ num_running_processes' до этого момента времени непосредственно из cumsum в столбце Start_Stop (+ 1/-1). Но это работает, если структура данных была переупорядочена по временной оси. – smci