Небольшой лайфхак. Клиент прислал данные такого типа
df = data.frame(id = c(1,1,1,2,2,2), begin=c('01.01.2018', '01.02.2018','01.03.2018', '01.04.2018','01.05.2018', '01.06.2018' ), end=c('01.01.2018', '01.03.2018','01.04.2018', '01.04.2018','01.06.2018', '01.07.2018'), category = c('Прием', 'Повышение', 'Увольнение','Прием', 'Повышение', 'Увольнение' )) id begin end category 1 1 01.01.2018 01.01.2018 Прием 2 1 01.02.2018 01.03.2018 Повышение 3 1 01.03.2018 01.04.2018 Увольнение 4 2 01.04.2018 01.04.2018 Прием 5 2 01.05.2018 01.06.2018 Повышение 6 2 01.06.2018 01.07.2018 УвольнениеToy example. Здесь id - табельный работника, и вы видите, что первые три строки - это все про одного работника. Begin - начало как-то периода. End - конец периода. category, соответственно, описание периода. Так, например, работник один был принят 1 января 2018, уволился 1 апреля 2018.
Проблема данных в том, что в первой строке ячейка end равна ячейке begin. Ну так система велась. А нам надо посчитать продолжительность каждого периода. Для корректного анализа нам надо заменить значение колонки end, которая соответствует category = Прием значением из колонки begin строки, следующей за приемом. Т.е. в первой строке наших данных значение колонки end 01.01.2018 нам необходимо заменить на значение 01.02.2018 колонки begin следующей строки.
И делаем мы это с помощью следующей формулы
df$number = c(1:nrow(df))Создаем новую переменную, которая содержит номера строк. И
df$end1 = ifelse(df$id == df$id[df$number+1] & df$category == 'Прием', as.character(df$begin[df$number+1]), as.character(df$end)) df id begin end category number end1 1 1 01.01.2018 01.01.2018 Прием 1 01.02.2018 2 1 01.02.2018 01.03.2018 Повышение 2 01.03.2018 3 1 01.03.2018 01.04.2018 Увольнение 3 01.04.2018 4 2 01.04.2018 01.04.2018 Прием 4 01.05.2018 5 2 01.05.2018 01.06.2018 Повышение 5 01.06.2018 6 2 01.06.2018 01.07.2018 Увольнение 6 01.07.2018Можно было сразу результат записывать в переменную df$end, но я создал переменную end1, чтобы можно было сравнить end и end1.
Обратите внимание, у нас end1 меняется только в тех строках, что соответствуют category = Прием, и меняются на значение переменной begin следующей строки.
That's all.
** и да, дальше переменную begin и end1 надо перевести в формат Даты, посчитать время, но это другая история
Приглашаю записать на Он-лайн курс "Введение в R для HR" и Семинар-практикум "HR-Аналитика в R", Москва, 21-22 ноября
Комментариев нет:
Отправить комментарий