У меня есть набор данных, который состоит из date_time, аккаунта (оба символа) и суммы (числовой), как показано ниже:
sample data:
date_time <- as.character(c('2018-01-22 18:18:00','2018-01-22 18:18:05','2018-01-22 18:18:19','2018-01-22 18:18:00','2018-01-22 18:30:12','2018-01-22 18:18:11'))
account <- as.character(c('a0001','a0001','a0001','b0001','b0001','c0001'))
amount <- c(1000,200,300,10000,400,10000)
df.sample <- data.frame(date_time, account, amount)
Я хотел бы вернуть значение ИСТИНА, если для транзакции с таким суммарным счетом> = 2 И общая сумма> = 12000 в течение 1 минуты для каждого аккаунта, В противном случае - ЛОЖЬ.
Я написал функцию, используя dplyr, как показано ниже:
simulation <- function(df, v.acct, v.date.time) {
# v.acct <- '5408044133161021'
# v.date.time <- as.POSIXct('2018-01-22 18:18:11')
#time.interval <- 120
#subset
df2 <- df %>%
mutate(date.time=as.POSIXct(date_time),
diff.time=difftime(v.date.time, date.time, units=c('mins'))) %>%
filter(account %in% v.acct, diff.time <= time.interval, diff.time > 0)
df.summary <- df2 %>%
group_by(account) %>%
summarise(agg.cnt=n(),
agg.amt=sum(amount))
nrow <- df.summary %>% filter(agg.cnt>=agg.count, agg.amt>=agg.amount) %>% nrow()
result <- ifelse(nrow==0, FALSE, TRUE)
return(result)
}
И вектор будет возвращен, которые содержат ИСТИНА или ЛОЖЬ:
time.interval <- 10
agg.count <- 10
agg.amount <- 20000
v.result <- apply(df[,c(1,2)],1,function(x) simulation(x[2],x[1]))
Выпуск:
Выше кода, способного вернуть результат, в то время как если набор данных станет более 90000 наблюдений, время вычислений будет очень большим. Есть ли альтернативный метод? Спасибо