可能更容易爲您的工作與簡單的非滾動參數化聚合。下面是我在想什麼:
fraudRate <- function(df,endDate,lookbackDays) {
endDate <- as.Date(endDate);
startDate <- endDate-lookbackDays+1L;
df <- subset(df,Tran_date>=startDate & Tran_date<=endDate);
aggregate(Fraud_ind~User_ID,df,function(x) sum(x)/length(x));
}; ## end fraudRate()
您可以通過fraudRate()
運行一個循環計算它的不同endDate
/lookbackDays
參數。
演示:
:在你的示例數據
## generate data
set.seed(1L);
NU <- 3L; ND <- 365L*2L; NT <- 15L; probFraud <- 1/3;
df <- data.frame(
User_ID=sample(LETTERS[1:3],NT,T),
Tran_date=sub('^0','',format(sort(sample(seq(as.Date('2014-01-01'),by=1L,len=ND),NT,T)),'%d-%b-%y')),
Fraud_ind=sample(c(1,0),NT,T,c(probFraud,1-probFraud))
);
## clean up data
df$Tran_date <- as.Date(df$Tran_date,'%d-%b-%y'); ## date column to R Date type
df$Fraud_ind <- df$Fraud_ind==1; ## fraud column to R logical type
df;
## User_ID Tran_date Fraud_ind
## 1 A 2014-01-10 FALSE
## 2 B 2014-04-02 FALSE
## 3 B 2014-06-04 FALSE
## 4 C 2014-07-15 FALSE
## 5 A 2014-09-06 TRUE
## 6 C 2014-10-05 TRUE
## 7 C 2014-10-07 TRUE
## 8 B 2014-10-09 FALSE
## 9 B 2014-12-30 TRUE
## 10 A 2015-04-21 FALSE
## 11 A 2015-06-08 TRUE
## 12 A 2015-07-22 FALSE
## 13 C 2015-09-27 TRUE
## 14 B 2015-11-14 FALSE
## 15 C 2015-12-26 FALSE
fraudRate(df,'2015-06-01',365L);
## User_ID Fraud_ind
## 1 A 0.5000000
## 2 B 0.3333333
## 3 C 0.6666667
演示
df <- data.frame(User_ID=c('A','A','A','A','A'),Tran_date=c('1-Jan-15','2-Jan-15','3-Jan-15','4-Jan-13','5-Jan-10'),Fraud_ind=c(1L,1L,0L,0L,1L),stringsAsFactors=F);
df$Tran_date <- as.Date(df$Tran_date,'%d-%b-%y'); ## date column to R Date type
df$Fraud_ind <- df$Fraud_ind==1; ## fraud column to R logical type
df;
## User_ID Tran_date Fraud_ind
## 1 A 2015-01-01 TRUE
## 2 A 2015-01-02 TRUE
## 3 A 2015-01-03 FALSE
## 4 A 2013-01-04 FALSE
## 5 A 2010-01-05 TRUE
fraudRate(df,max(df$Tran_date),365L);
## User_ID Fraud_ind
## 1 A 0.6666667
您需要添加數據集以其他方式幫助一個重複的例子,是非常困難的。看看'dput()'函數來幫助這個 –
「last 365 days」是什麼意思?你是否想從當前日期或某個指定日期找出差異?如果你想從現在的日期找到,那麼我擔心輸出是錯誤的。 –