0

我是 R 新手,并试图通过滚动方式计算 3 个月的拖欠。

我的数据框由(CID、acquistion_date 和 delinquient)组成

我正在尝试创建一个新的数据帧,其中附加了第 4 列(Roll_deliquency),即过去 3 个月的拖欠计数)。一旦我们有了新的客户 ID,我们就会重新开始该客户的第一笔交易。Roll_Deliquiency 是过去 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代码吗?我尝试使用滚动应用,但无法根据需要进行自定义。

4

1 回答 1

0

这可能不是您想要的,但这是我目前对问题的理解所能做的最好的事情。对于数据文件中的每个人和每个日期,我都及时回溯了 90 天,并总结了拖欠的数量。我的结果存储在 vector 中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
于 2013-02-28T08:06:49.063 回答