Для проекта, над которым я работаю, мне нужен фрейм данных, чтобы указать, отсутствовал ли человек (0) или нет (1) в определенный день.
Проблема в том, что мои данные представлены в формате, в котором указывается начальная дата отсутствия, а затем количество дней, в течение которых человек отсутствовал.
Пример моего фрейма данных:
df1 <- data.frame(Person = c(1,1,1,1,1),
StartDate = c("01-01","02-01","03-01","04-01","05-01"),
DAYS = c(3,NA,NA,NA,1))
Вместо «Дата начала» и «Количество дней отсутствия» на человека это должно выглядеть так:
df2 <- data.frame(Person = c(1,1,1,1,1),
Date = c("01-01","02-01","03-01","04-01","05-01"),
Absent = c(1,1,1,0,1))
На данный момент я решил это с помощью цикла for с двумя условиями if:
for(i in 1:nrow(df1)){
if(!is.na(df1$DAYS[i])){
var <- df1$DAYS[i]
}
if(var > 0){
var <- var-1
df1$DAYS[i] <- 1
}
}
Это работает, однако у меня есть тысячи людей с датами за полный год, а это означает, что у меня более 5 миллионов строк в моем фрейме данных. Вы можете себе представить, насколько медленная петля.
Кто-нибудь знает более быстрый способ решить мою проблему? Я попытался просмотреть пакет lubridate для работы с периодами и датами, но не вижу там решения.
data.table
в том же ключе:setDT(df1)
;df1[ , Absent := 0]
;df1[df1[ , {ri <- .I[!is.na(DAYS)]; rep(ri, DAYS[ri]) + sequence(DAYS[ri]) - 1}], Absent := 1]
20.02.2019