Табель рабочего времени с данными по каждому дню месяца в столбцах - как конвертировать в дату? - PullRequest
0 голосов
/ 31 августа 2018

У меня есть data.frame, представляющий табель рабочего времени для нескольких сотрудников в течение нескольких месяцев, охватывающих 2 года. Данные выглядят так:

Name         Month      1     2     3   ...  31    Total  Job     ... [more columns]

John Smith   Aug 2017   1:20                       1:20   Typing
Mary Jones   Sep 2017                                     Prooing
John Smith   Oct 2017         0:15           1:10  1:25   Typing
...
Jim Miles    Feb 2018         1:30  2:10           3:40   Admin

Есть 31 столбец, каждый из которых представляет дату в соответствующем месяце. Там будет несколько строк с одним и тем же именем.

Итак, глядя на первую запись, Джон Смит проделал 1 час 20 минут работы 1 августа 2017 года.

Что я хочу сделать, так это проанализировать эти данные детально, например,

  • Сколько часов Джон Смит потратил на набор текста в сентябре 2017 года?
  • Сколько проверок было проведено в январе-феврале 2018 года?

Я немного застрял в том, как поступить, чтобы получить данные для анализа. Предложения приветствуются.

Добавлено для уточнения:

Прочитав три очень полезных ответа и посмотрев на tidyr, я прояснил свои мысли и подумал, что мне нужно изменить данные, чтобы в каждой записи была одна строка, поэтому пример таблицы станет:

Name         Date          Duration  Job     ... [more columns]

John Smith   01 Aug 2017   1:20      Typing
John Smith   02 Oct 2017   0:15      Typing
John Smith   31 Oct 2017   0:15      Typing
...
Jim Miles    02 Feb 2018   1:30      Admin
Jim Miles    03 Feb 2018   2:10      Admin

Дата должна быть правильно отформатирована, но это не главное. Проблема заключается в сопоставлении дня месяца с соответствующим месяцем и годом для получения составной даты. Любые идеи приветствуются.

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

После проверки предложений @Khlick мне удалось использовать gather():

mydata <- mydata %>% gather(new_date, time_spent, "1":"31")

В результате были получены два новых столбца, new_date и time_spent, а затем создана новая строка для каждой точки данных столбцов 1–31.

Итак, теперь для каждой точки данных у меня был месяц, например, Aug 2017 в одном столбце - день, когда работа была выполнена, например, 12 в другом. Я изменил месяц на дату в исходной электронной таблице, поэтому она стала 2017-08-01 (у всех дат теперь есть 01). Затем в R я использовал substr() и paste(), чтобы заменить день на правильный, то есть 2017-08-12.

Наконец, у меня осталось большое количество строк без значения в time_spent. Я удалил эти строки.

Теперь у меня есть:

Имя Дата Продолжительность Работа ... [больше столбцов]

John Smith   2017-08-01   1:20      Typing
John Smith   2017-10-02   0:15      Typing
John Smith   2017-10-31   0:15      Typing
...
Jim Miles    2018-02-02   1:30      Admin
Jim Miles    2018-02-03   2:10      Admin

Я сделал несколько выборочных проверок и, похоже, данные были преобразованы правильно. Спасибо всем, особенно @ Khlick.

0 голосов
/ 31 августа 2018

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

Что-то вроде этого:

x <- c("1:20", "1:25", "3:40")
x <- strsplit(x, ":")

sapply(x, FUN = function(m) {
  m <- as.numeric(m)
  sum(m[1], m[2]/60)
  })

[1] 1.333333 1.416667 3.666667

Затем вы можете использовать aggregate для суммирования по месяцу-году и имени.

aggregate(Total ~ Name + Month + Job, data = xy, FUN = sum)

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

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