【发布时间】:2018-06-26 19:37:08
【问题描述】:
我有一个由 date_time、account(都是字符)和金额(数字)组成的数据集,如下所示:
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)
如果每个账户在 1 分钟内的总计数 >= 2 且总金额 >= 12000 的交易,我想返回 TRUE,否则返回 FALSE。
我用 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)
}
将返回包含 TRUE 或 FALSE 的向量:
time.interval <- 10
agg.count <- 10
agg.amount <- 20000
v.result <- apply(df[,c(1,2)],1,function(x) simulation(x[2],x[1]))
问题: 上面的代码能够返回结果,而如果数据集超过 90,000 次观察,计算时间会很长。有没有替代方法?谢谢
【问题讨论】: