Текущий расчет правонарушений для кадра данных
Я новичок в R и пытаюсь найти способ рассчитать 3-месячный деликатес на скользящей основе.
Мой фрейм данных состоит из (CID, acquistion_date и delinquient)
я пытаюсь создать новый фрейм данных с добавленным 4-м столбцом (Roll_deliquency), то есть количество правонарушений за последние 3 месяца). Как только у нас появляется новый идентификатор клиента, мы снова начинаем с первой транзакции этого клиента. Roll_Deliquity - это общее количество правонарушителей только за последние 3 месяца.
ожидаемый результат как ниже
CID AQ_DATE Delinquient Roll_Deliquiency
103 2007/03/18 1 0
103 2007/04/03 0 1
103 2007/04/17 0 1
103 2007/05/03 0 1
103 2007/05/17 1 1
103 2007/06/02 1 2
103 2007/06/16 1 3
103 2007/07/02 1 3
103 2008/01/03 1 0
103 2008/01/17 1 1
103 2008/02/02 0 2
103 2008/02/16 1 2
105 2007/01/01 1 0
105 2007/01/11 1 1
105 2007/02/10 1 2
105 2007/02/14 0 3
105 2007/02/17 1 3
105 2007/02/17 1 4
105 2007/02/17 1 5
105 2007/04/02 0 5
105 2007/04/10 1 5
Может кто-нибудь помочь мне с кодом R? Я пытался использовать Rolling App, но не смог настроить так, как нужно.
1 ответ
Это может быть не то, что вы хотите, но это лучшее, что я могу сделать с моим текущим пониманием проблемы. Для каждого человека и каждой даты в файле данных я вернулся на 90 дней назад и суммировал количество правонарушений. Мои результаты хранятся в векторе my.count
, Мои результаты не совпадают Roll_Deliquiency
, Однако, возможно, это поможет вам начать. Если вы предоставите дополнительную информацию о том, как Roll_Deliquiency
рассчитывается, я мог бы изменить код ниже. Я мог бы также очистить код немного скоро. В настоящее время он включает в себя некоторые переменные, которые я не использовал для получения ответа.
df.1 <- read.table(text='
CID AQ_DATE Delinquient Roll_Deliquiency
103 2007/03/18 1 0
103 2007/04/03 0 1
103 2007/04/17 0 1
103 2007/05/03 0 1
103 2007/05/17 1 1
103 2007/06/02 1 2
103 2007/06/16 1 3
103 2007/07/02 1 3
103 2008/01/03 1 0
103 2008/01/17 1 1
103 2008/02/02 0 2
103 2008/02/16 1 2
105 2007/01/01 1 0
105 2007/01/11 1 1
105 2007/02/10 1 2
105 2007/02/14 0 3
105 2007/02/17 1 3
105 2007/02/17 1 4
105 2007/02/17 1 5
105 2007/04/02 0 5
105 2007/04/10 1 5', header=T, colClasses=c('character', 'character', 'integer', 'integer'))
df.1$AQ_DATE2 <- as.Date(df.1$AQ_DATE, "%Y/%m/%d")
df.1$running.count = sequence(rle(df.1$CID)$lengths)
df.1
max.value <- data.frame(id.max = with(df.1, tapply(running.count, CID, function(x) x[length(x)])))
max.value
max.value$CID <- row.names(max.value)
max.value
all.data <- merge(max.value, df.1, by=c('CID'), all = TRUE)
all.data
my.count <- rep(0, nrow(all.data))
m <- 1
for(i in length(unique(all.data$CID)):1) {
all.data.i <- subset(all.data, all.data$CID == max.value$CID[i])
print(all.data.i)
for(j in nrow(all.data.i):1) {
for(k in j:1) {
if(((j-k) > 1) &
(as.numeric(all.data.i$AQ_DATE2[j] - all.data.i$AQ_DATE2[k+1]) <= 90) &
(as.numeric(all.data.i$AQ_DATE2[j] - all.data.i$AQ_DATE2[k ]) > 90)) my.count[m] = sum(all.data.i$Delinquient[(k+1):j])
if(((j-k) == 1) &
as.numeric(all.data.i$AQ_DATE2[j] - all.data.i$AQ_DATE2[k]) > 90) my.count[m] = all.data.i$Delinquient[j]
if((k == 1) &
as.numeric(all.data.i$AQ_DATE2[j] - all.data.i$AQ_DATE2[1]) <= 90) my.count[m] = sum(all.data.i$Delinquient[1:j])
}
m = m + 1
}
}
my.count
[1] 6 5 6 5 4 3 3 2 1 3 2 2 1 4 4 3 2 1 1 1 1