Как ссылаться на предыдущие строки по счету и дате - PullRequest
0 голосов
/ 30 августа 2018

У меня есть набор данных, похожий на следующий формат:

Account_ID Date       Delinquency age count  
1          01/01/2016 0           1   0  
1          02/01/2016 1           2   0    
1          03/01/2016 2           3   1   
1          04/01/2016 0           4   2   
1          05/01/2016 1           5   2  
1          06/01/2016 2           6   2  
2          01/01/2016 0           1   0   
2          02/01/2016 0           2   0  
2          03/01/2016 1           3   0  
2          04/01/2016 0           4   1   
2          05/01/2016 1           5   1  
3          01/01/2016 1           1   0  
3          02/01/2016 2           2   1  
3          03/01/2016 3           3   2  
3          04/01/2016 4           4   3  
3          05/01/2016 5           5   4  
3          06/01/2016 6           6   5  

Я хочу посчитать количество ненулевых за предыдущие 3 месяца по счету для каждой строки, т.е. я хочу создать переменную count, используя первые 4 переменные (Account_ID, Date, Delinquency, Age). Я хотел бы знать, как это сделать за n прошлых месяцев. Я надеюсь, что смогу распространить это упражнение на другие задачи, такие как определение максимальной преступности за последние 3 месяца.

1 Ответ

0 голосов
/ 07 сентября 2018

Добро пожаловать в SE!

Если вы хотите посчитать ненулевое значение последовательности за 3 предыдущих месяца по счету для каждой строки, вы можете использовать функцию aggregate, а также функцию zlag пакета TSA следующим образом (см. код ниже). Поскольку данные, предоставленные вами в столбце count, сложно интерпретировать, а также связать с условием при условии, что данные в примере были смоделированы.

library(lubridate)
set.seed(123)

# data simulation
df <- data.frame( id = factor(rep(0:9, 100)),
                  date = sample(seq(ymd("2010-12-01"), by = 1, length.out = 1000), 1000, replace = TRUE),
                 deliquency = sample(c(rep(0, 30), 1:5), 1000, replace = TRUE),
                 age = sample(1:10, 1000, replace = TRUE))

head(df)

# id       date deliquency age
# 1  0 2011-08-06          0  10
# 2  1 2013-08-16          0   6
# 3  2 2012-11-17          0   1
# 4  3 2012-09-12          0   9
# 5  4 2011-07-29          0   1
# 6  5 2011-02-25          0   9


# aggregation of non-zero deliquency by month
df$year_month <- df$date
day(df$year_month) <- 1
df_m <- aggregate(deliquency ~ id + year_month, data = df, sum)
df_m <- df_m[order(as.character(df_m$id, df_m$year_month)), ]
df_m$is_zero <- df_m$deliquency > 0

head(df_m)
# id year_month deliquency is_zero
# 1   0 2010-12-01          1    TRUE
# 10  0 2011-01-01          0   FALSE
# 19  0 2011-02-01          0   FALSE
# 29  0 2011-03-01          0   FALSE
# 39  0 2011-04-01          0   FALSE
# 65  0 2011-07-01          1    TRUE


# calculate zero-deliquency events for three last months
library(TSA)
dfx <- df_m
df_m_l <- by(df_m, df_m$id, function(dfx) {
    dfx$zero_del <- zlag(dfx$is_zero, 1) + zlag(dfx$is_zero, 2) + zlag(dfx$is_zero, 3) 
    dfx})

df_m_res <- do.call(rbind, df_m_l)
head(df_m_res)

В качестве выходных данных вы можете увидеть data.frame, который показывает ненулевое количество событий просроченности за последние 3 месяца. Например. вывод здесь:

     id year_month deliquency is_zero zero_del
0.1   0 2010-12-01          1    TRUE       NA
0.10  0 2011-01-01          0   FALSE       NA
0.19  0 2011-02-01          0   FALSE       NA
0.29  0 2011-03-01          0   FALSE        1
0.39  0 2011-04-01          0   FALSE        0
0.65  0 2011-07-01          1    TRUE        0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...