2013-02-26 4 views
0

나는 R에 익숙하며 3 개월 지연 계산을 계산하기 위해 문제를 풀려고 노력하고있다.데이터 프레임에 대한 롤링 delinquiency 계산

내 dataframe 내가 추가 된 4 열 (Roll_deliquency) 최근 3 개월 delinquient의 예 카운트)로 새로운 dataftrame을 만들려고하고 있어요 (CID, acquistion_date 및 delinquient)

로 구성되어 있습니다. 새로운 고객 ID를 얻 자마자 고객의 첫 번째 거래를 다시 시작합니다. Roll_Deliquiency는 지난 3 개월 동안의 delinquient 총계입니다..

예상되는 결과는 누군가가 R 코드를 좀 도와 주시겠습니까

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 

다음과 같이인가? 나는 롤링 적용을 시도했지만 필요에 따라 같은 것을 사용자 정의 할 수 없었다.

+0

'cumsum'을 사용하고 싶지만, 예를 들어'Roll_Delinquincy'는'cumsum'과 일치하지 않습니다. 컬럼이 무엇인지 명확히 설명하십시오. 그 때까지는 누적 된 연체자가 아니기 때문입니다. –

+0

아니요, 그것은 cumsum이 아닙니다. 나는 더 나은 명료성을 위해 문제를 수정했다. 아직 논리를 이해하는 데 어려움이 있으면 알려주십시오. – user2109967

+0

오른쪽 껍데기 아래쪽에 3 개의 5가 있어야하나요? –

답변

0

이것은 사용자가 원하는 것은 아니지만 문제에 대한 현재의 이해와 함께 할 수있는 최선입니다. 각 사람과 데이터 파일의 각 날짜에 대해 저는 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 
+0

Mark 동일한 날짜에 2 건 이상의 거래가있는 경우와 수를 0으로 설정 한 경우에만 답이 일치하는 것 같습니다. 나는 그 사실을 확인하고 코드를 따라 가려고합니다. 또한 내림차순으로 레코드를 표시하는 것을 관찰합니다. – user2109967

+0

Roll_deliquiency 논리 : rowal1에 대한 Roll_Deliquiency는 0입니다. row9 (새 기간의 시작과 같음) 및 row13을 새로운 고객으로 간주합니다. row6 Roll_Deliquiency는 2입니다. 위쪽으로 이동하면 모든 aq_date가 3 개월 이내에 나타납니다. 우리는 현재 행 deliquiecy를 계산하지 않습니다. row7에 대한 AQ_DATE가 2007/06/16이기 때문에 유사하게 row7이 3이고 행 6에서 행 1로 다시 이동하면 각 행에 대한 모든 AQ_DATE가 row7의 90 일 이내에 있습니다 – user2109967

+0

my. rev (my.count)를 사용하여 계산하십시오. –

관련 문제