.

Сделать репост в соц сети!

понедельник, 1 июля 2019 г.

Подстановка значений в data.frame из строки N+1



Небольшой лайфхак. Клиент прислал данные такого типа

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 ноября
 


Подстановка значений в data.frame из строки N=1


Комментариев нет:

Отправить комментарий