2017-08-01 104 views
0

我有一個數據,我試圖使用double for循環來進行聚合。基本上,我想通過每個TOP_LEVEL_CATEGORY來計算每個MEM_ID的購買週期。數據如下所示,R中的雙循環給出不相關的輸出

MEM_ID ORDER_DEL_DATE TOP_LEVEL_CATEGORY 
999984 2016-01-07   household 
999984 2016-02-03   household 
999980 2015-12-16   household 
999980 2016-01-03   household 
999980 2016-01-05   household 
999980 2016-02-14   household 
999984 2016-01-07   personal-care 
999980 2016-01-03   personal-care 
999980 2016-01-30   personal-care 

代碼

PC_test <- NA 
for(i in unique(test$MEM_ID)){ 
    for(j in unique(test$TOP_LEVEL_CATEGORY)){ 
    PC_test[c(i,j)] <- data.frame(c(MEM_ID=i,CATEGORY=j,ifelse(nrow(test[test$MEM_ID==i & test$TOP_LEVEL_CATEGORY==j,])<=2, 
       max(test[test$MEM_ID==i & test$TOP_LEVEL_CATEGORY==j,"ORDER_DEL_DATE"])-min(test[test$MEM_ID==i & test$TOP_LEVEL_CATEGORY==j,"ORDER_DEL_DATE"]), 
        max(test[test$MEM_ID==i & test$TOP_LEVEL_CATEGORY==j,"ORDER_DEL_DATE"])-maxN(test[test$MEM_ID==i & test$TOP_LEVEL_CATEGORY==j,"ORDER_DEL_DATE"])))) 
    } 
} 

注:MAXN函數給出第二大。

投擲如下不相關輸出,

NA. X999984 household personal.care X999980 
NA  999984  999980  999980   999980 
NA personal-care household personal-care personal-care 
NA 0    40   27    27 

我期望的輸出在下面的格式,

MEM_ID  TOP_LEVEL_CATEGORY PC_test 
999984   household   27 
999984   personal-care  0 
999980   household   40 
999980   personal-care  27 

幫助是不勝感激。提前致謝!!!

+0

你可能不需要'for'循環(類似'by'和'aggregate'的函數可能會有所幫助)。 __請添加關於如何在您的問題中計算「購買週期」的說明_ – bouncyball

+0

@bouncyball,購買週期是特定客戶上一次購買與上次購買時的差異。 – Yashwanth

回答

1

我想你想是這樣的

require(data.table) 

setDT(df1) 

# calculate the min and max date for each MEM_ID/TOP_LEVEL_CATEGORY pair, then find the difference for PC_test 
df1[, .(max_date=max(ORDER_DEL_DATE), min_date=min(ORDER_DEL_DATE)), 
    keyby=.(MEM_ID,TOP_LEVEL_CATEGORY)][, .(MEM_ID, TOP_LEVEL_CATEGORY, PC_test = max_date - min_date)] 


    MEM_ID TOP_LEVEL_CATEGORY PC_test 
1: 999980   household 60 days 
2: 999980  personal-care 27 days 
3: 999984   household 27 days 
4: 999984  personal-care 0 days 
根據你所說的話

,這是我對你是如何計算PC_test沒有完全分裂開的最小值和最大值的公式猜測。

+0

@Frank你失去了類別,如果你這樣做。您仍然可以獲得PC_test的正確日期編號,儘管 – Mako212

+1

@Frank這是避免重複的好方法,我更新瞭解決方案以反映您的輸入。 – Mako212

+0

好吧,注意:這種方式很好,因爲它很高效(請參閱'?GForce'),但是'df1 [,。(PC_test = max(ORDER_DEL_DATE) - min(ORDER_DEL_DATE)),keyby =。(MEM_ID,TOP_LEVEL_CATEGORY)我猜也應該可以工作。 – Frank