Проверять дату в Datespan несколько раз - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть данные, которые выглядят так:

Data <- "Person Address Starting.Date  Resignation.Date Job
 John         abc       01.01.2017    03.01.2017        IT      
  Sarah        cde      06.01.2017 06.07.2017       Teacher
  Susi         bfg     09.06.2017  08.09.2017     secretary"
Data <- read.table(text=zz, header = TRUE)

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

Data$Span<- ifelse(Data$Resignation.Date>= "01.01.2017" & Data$Resignation.Date <= "31.01.2017", 1, 
                              ifelse(Data$Resignation.Date>= "01.02.2017" & Data$Resignation.Date <= "28.02.2017", 2,
                                     ifelse(Data$Resignation.Date>= "01.03.2017" & Data$Resignation.Date <= "31.03.2017", 3,
                                            ifelse(Data$Resignation.Date>= "01.04.2017" & Data$Resignation.Date <= "30.04.2017", 4,
                                                   ifelse(Data$Resignation.Date>="01.05.2017" & Data$Resignation.Date <= "31.05.2017",5, 
                                                          ifelse(Data$Resignation.Date>="01.06.2017" & Data$Resignation.Date<="30.06.2017",6, 
                                                                 ifelse(Data$Resignation.Date>="01.07.2017" & Data$Resignation.Date<="31.07.2017",7, 
                                                                        ifelse(Data$Resignation.Date>="01.08.2017" & Data$Resignation.Date<="31.08.2017", 8,
                                                                               ifelse(Data$Resignation.Date>="01.09.2017" & Data$Resignation.Date<="30.09.2017", 9,
                                                                                      ifelse(Data$Resignation.Date>="01.10.2017" & Data$Resignation.Date<="31.10.2017",10,
                                                                                             ifelse(Data$Resignation.Date>="01.11.2017" & Data$Resignation.Date<="30.11.2017", 11,
                                                                                                    ifelse(Data$Resignation.Date>="01.12.2017" & Data$Resignation.Date<="31.12.2017",12,999))))))))))))

Представленные мною данные относятся к подмножеству людей, которые начали работать в январе.У меня есть подмножества на все 12 месяцев в 2017 году. Я хочу использовать один и тот же код для людей, которые начали работать в феврале / марте / и так далее.Чтобы сделать это, мне нужно изменить код, так как он начинается с первой строки и добавляет один месяц, а затем добавляет один месяц для всех последующих строк.Так, например, для подмножества февраля он будет начинаться с

Data$Resignation.Date>= "01.02.2017" & Data$Resignation.Date <= "28.02.2017.2017", 1,

и заканчиваться

 ifelse(Data$Resignation.Date>="01.01.2018" & Data$Resignation.Date<="31.01.2018",12,999

. Есть ли способ сделать это без копирования кода и внесения изменений вручнуюза каждый месяц?Поскольку изменения следуют определенной систематической системе, я думаю, что это будет возможно, но я не мог найти никакого решения для этого.Я искал решения в пакете dplyr, так как думал, что моя проблема подходит, но это мне не помогло.Буду очень благодарен за любой совет.Конечно, я с радостью отвечу на оставшиеся вопросы.

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

Data <- TotalData[TotalData$Starting.Date>= "01.01.2017" & TotalData$Starting.Date <= "31.01.2017",]

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Вы можете сделать это с помощью пакета lubridate, чтобы узнать время пребывания человека в компании.

library(lubridate)
Data <- "Person Address Starting.Date  Resignation.Date Job
 John         abc       01.01.2017    03.01.2017        IT      
 Sarah        cde      06.01.2017 06.07.2017       Teacher
 Susi         bfg     09.06.2017  08.09.2017     secretary"
Data <- read.table(text=Data, header = TRUE)

Data$Starting.Date = dmy(Data$Starting.Date)
Data$Resignation.Date = dmy(Data$Resignation.Date)


time.interval <- Data$Starting.Date %--% Data$Resignation.Date
time.period <- as.period(time.interval)
time.period <- month(time.period)
Data$Span <- time.period
0 голосов
/ 07 декабря 2018

Я думаю, что этого кода должно быть достаточно для выполнения вашей работы: - Логика: если дата начала и дата окончания совпадают, это даст вам 1, а если они не совпадают, это даст вам разницу в количестве месяцев, в течение которых служащий былтам для компании

library(lubridate)

Data$Starting.Date <- dmy(Data$Starting.Date)
Data$Resignation.Date <- dmy(Data$Resignation.Date)

Data$code<- ifelse(month(Data$Starting.Date) == month(Data$Resignation.Date),1,(interval(Data$Starting.Date, Data$Resignation.Dat) %/% months(1)))

Данные: -

Data <- structure(list(Person = structure(1:4, .Label = c("John", "johnyy", 
"Sarah", "Susi"), class = "factor"), Address = structure(c(1L, 
1L, 3L, 2L), .Label = c("abc", "bfg", "cde"), class = "factor"), 
    Starting.Date = structure(c(17167, 17199, 17172, 17326), class = "Date"), 
    Resignation.Date = structure(c(17169, 17199, 17353, 17417
    ), class = "Date"), Job = structure(c(1L, 1L, 3L, 2L), .Label = c("IT", 
    "secretary", "Teacher"), class = "factor"), code = c(1, 2, 
    999, 999)), row.names = c(NA, -4L), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...