У меня есть данные транзакции в формате ниже.
transaction <- data.frame(account_id=c('ID001','ID001','ID002','ID002','ID001','ID002'), transaction_date=c('2017-01-02','2017-01-03','2017-01-03','2017-01-05','2017-01-06','2017-01-08'))
![enter image description here](https://i.stack.imgur.com/NmbtY.jpg)
Я хочу указать, какая учетная запись неактивна в течение трех месяцев подряд в течение 1 января 2017 года и 31 декабря 2017 года. Это мой код R.
library(dplyr)
list_account_id <- transaction %>% distinct(account_id)
list_account_id <- list_account_id$account_id
churn_label <- data.frame("account_id" = c('ID000'), "churn_date" = c(as.Date('9999/99/99')), "label"=c(0))
for (int_account_id in list_account_id){
start_date <- as.Date('2017-01-01')
break_while <- FALSE
while(!break_while){
end_date <- start_date+90
int_transaction <- transaction %>% filter(account_id == int_account_id)
int_transaction %>% filter(as.Date(transaction_date) <= end_date, as.Date(transaction_date) >= start_date) %>% summarise(n=n())
sum_ntransaction <- int_transaction %>% filter(as.Date(transaction_date) <= end_date, as.Date(transaction_date) >= start_date) %>% summarise(n=n())
if(sum_ntransaction$n == 0){
churn_label_temp <- data.frame("account_id" = c(int_account_id), "churn_date" = c(start_date), "label"=c(1))
churn_label <- rbind(churn_label, churn_label_temp)
break_while <- TRUE
}
if(end_date == as.Date('2017-12-31')){
churn_label_temp <- data.frame("account_id" = c(int_account_id), "churn_date" = c('9999/99/99'), "label"=c(0))
churn_label <- rbind(churn_label, churn_label_temp)
break_while <- TRUE
}
start_date <- start_date+1
}
}
Вывод моего кода
![enter image description here](https://i.stack.imgur.com/AwQEu.jpg)
Однако мой код очень медленный. Есть ли другой способ сделать это?