2017-08-01 4 views
0

double forループを使用して集計しようとしているデータがあります。基本的には、TOP_LEVEL_CATEGORYごとに各MEM_IDの購入サイクルを計算したいと思います。データは、コード二重forループin無関係の出力を与える

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"])))) 
    } 
} 

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 

、以下のように示される:MAXN機能は、第二の最大を与えます。 I形式以下で出力を期待し、以下のように

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'のような機能が役に立ちます)。 __pleaseあなたの質問で「購入サイクル」がどのように計算されたかの説明を追加してください.__ – bouncyball

+0

@bouncyball、購入サイクルは、特定の顧客が前回の前回の購入から最後の購入をした時期です。 – Yashwanth

答えて

1

私はあなたがこれはあなたが完全にあなたの最小値と最大値の式を離れて壊すことなくPC_testを計算している方法についての私の推測である、言ったことに基づくと、この

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 

ような何かをしたいと思います。

+0

@Frankあなたがそれを好きならCategoryを失う。 – Mako212

+1

@Frank重複を避けるのは良い点です。あなたの意見を反映するように私のソリューションを更新しました。 – Mako212

+0

メモ:この方法は効率的です( '?GForce'を参照)。しかし' df1 [、PC_test = max(ORDER_DEL_DATE) - min(ORDER_DEL_DATE))、keyby =。(MEM_ID、TOP_LEVEL_CATEGORY) ] 'もうまくいくはずです。 – Frank

関連する問題