Добавление неполный рабочий день в R - PullRequest
0 голосов
/ 09 марта 2020

У меня есть следующий снимок набора данных за месяц (я представляю здесь только первые два месяца, но у меня есть эти данные приблизительно для 300 000 человек за каждый месяц в 2014 году).

df<-data.frame( c(20140101, 20140116, 20140201, 20140215, 20150101, 20150201, 20150101, 20150201, 20150201), 
                c(20140115, 20140131, 20140214, 20140228, 20150131, 20150228, 20150131, 20150228, 20150228),
                c(15, 16, 14, 14, 31, 28, 31, 28, 28),
                c(0.8, 0.4, 0.8, 0.4, 0.8, 0.8, 0.8, 0.8, 0.2),
                c("q1", "q1", "q1", "q2","q2","q2", "q3", "q3", "q3"))
colnames(df)<-c("Begindate", "Enddate", "Duration", "part-time", "id")

Что дает следующий вывод

ID   Begindate     Enddate      Duration part-time 
q1   2014-01-01   2014-01-15      15       0.8
q1   2014-01-16   2014-01-31      16       0.4
q1   2014-02-01   2014-02-14      14       0.8
q1   2014-02-15   2014-02-28      14       0.4
q2   2015-01-01   2015-01-31      31       0.8
q2   2015-02-01   2015-02-28      28       0.8
q3   2015-01-01   2015-01-31      31       0.8
q3   2015-02-01   2015-02-28      28       0.8
q3   2015-02-01   2015-02-28      28       0.2

История, которая соответствует вышеуказанному набору данных, более или менее выглядит следующим образом. Человек q1 работает на двух работах каждый месяц. На одном из рабочих мест он работает 0,8, а на другом - 0,4. Человек q2 имеет только одну работу и работает там по 0,8 каждый месяц. И, наконец, в третьем квартале один человек работал на одной работе, что равнялось 0,8 полной занятости. Однако с февраля он начал устраиваться на другую работу рядом с работой, которая у него уже была.

Теперь я хотел бы переписать эти данные следующим образом

ID   Begindate     Enddate      part-time 
q1   2014-01-01   2014-01-31       0.6
q1   2014-02-01   2014-02-28       0.6
q2   2015-01-01   2015-01-31       0.8
q2   2015-02-01   2015-02-28       0.8
q3   2015-01-01   2015-01-31       0.8
q3   2015-02-01   2015-02-28       1.0

Другими словами, я хотел бы переписать данные таким образом, чтобы у меня был номер неполного рабочего дня для каждого человека на месячный уровень. Другими словами, q2 не изменяется, тогда как четыре строки q1 должны быть приведены в 1 строку для каждого месяца (я округлил коэффициенты неполного рабочего времени, как вы, возможно, заметили). Более того, в 3 квартале первый месяц не должен меняться, а второй месяц должен быть приведен в одну строку. Обратите внимание, что я опустил переменную продолжительности. Это просто для того, чтобы избежать путаницы, так как меня интересует номер неполный рабочий день.

Кто-нибудь здесь знает, как это сделать? Буду признателен за любую помощь.

1 Ответ

1 голос
/ 10 марта 2020

Как уже упоминалось в комментарии @Matias, вы можете создавать столбцы месяца и года, чтобы объединять строки и суммировать по месяцам / годам. Тем не менее, вам также нужно будет group_by ID. Кроме того, вы можете использовать Duration для каждой строки, а также общее количество дней в месяце для расчета взвешенной суммы.

Редактировать (19/19/20) : Отредактировано с изменением в примере данных и имен столбцов в вопросе. Также входит lubridate пакет.

library(tidyverse)
library(lubridate)

df %>% 
  mutate(Begindate = as.Date(as.character(Begindate), format = "%Y%m%d"),
         Enddate = as.Date(as.character(Enddate), format = "%Y%m%d")) %>%
  group_by(id, month = month(Begindate), year = year(Begindate)) %>%
  summarise(Begindate = first(Begindate),
            Enddate = last(Enddate),
            monthdays = as.numeric(difftime(Enddate, Begindate, units = "days")) + 1,
            part.time = round(sum(`part-time` * (Duration / monthdays)), 1))

Выход

# A tibble: 7 x 7
# Groups:   id, month [6]
  id    month  year Begindate  Enddate    monthdays part.time
  <fct> <dbl> <dbl> <date>     <date>         <dbl>     <dbl>
1 q1        1  2014 2014-01-01 2014-01-31        31       0.6
2 q1        2  2014 2014-02-01 2014-02-14        14       0.8
3 q2        1  2015 2015-01-01 2015-01-31        31       0.8
4 q2        2  2014 2014-02-15 2014-02-28        14       0.4
5 q2        2  2015 2015-02-01 2015-02-28        28       0.8
6 q3        1  2015 2015-01-01 2015-01-31        31       0.8
7 q3        2  2015 2015-02-01 2015-02-28        28       1  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...