2017-07-04 15 views
-1

**このデータは、3店舗のユニバースにわたる20件のサンプルデータです。ルールに基づいてどの店舗がどの注文に対応するかを識別するアルゴリズムを作成する**前の行の値に基づいてオプションから選択してください

注文に適した店舗が2店舗以上ある場合は、注文数量が最も少ない店舗が現在の注文に対応します。例えば は、S1、S2場合、& S3を順次#3までのオーダーの100、150、75のユニットに仕出し及びS1 & S2は、注文#4の対象としており、その後、S1は、注文に応じるであろう#4

実際には
OrderNum|OrderQty|StoresEligible 
------- |--------|-------------- 
1|12|S3 
2|10|S1 
3|19|S1,S2 
4|7|S1,S2 
5|14|S1,S2,S3 
6|19|S2 
7|5|S1,S2 
8|17|S2 
9|13|S3 
10|5|S1 

、米国および1Mの受注が2,000店舗

+0

何を試しましたか?何が効いていないのですか? – agenis

+0

この問題をどのように進めるのか分かりません。 各行の各ストアのカウントを取得して別々のテーブルに格納してから、OrderNumのループを実行して、(i + 1)番目の行の番号が小さいストアを識別します。 ロジックはかなり面白く聞こえますが、コーディングするのはかなり難しいです。 – user3117837

+0

実際に各注文をどの店舗が実際に配送したかを知る方が良いでしょう。あなたがこの変数を持っていないならば、あなたは新しい順序で全履歴を繰り返し計算し直さなければならないでしょう... – agenis

答えて

1

があるOKこれはあなたの問題の一部を解決し、それが入力として過去を取って、自分のデータに新しい行を追加するための機能ですデータ(ChoosenStore情報を追加したデータ)と数量とeligibル・ストア。これは完了したN + 1オーダーのdata.frameを出力します:

これを繰り返して、このデータを完成させる必要があります。

library(dplyr); library(tidyr) 
# initialise the data.frame with just the first 3 lines 
df=data.frame(OrderNum=1:3, OrderQty=c(12,10,19), 
       StoresEligible=c("S3", "S1", "S1, S2"), 
       ChoosenStore=c("S3", "S1", "S2"),stringsAsFactors=FALSE) 
# function to compute new incoming order 
NewOrder = function(df, quantity, eligible){ 
    choosen <- df %>% filter(ChoosenStore %in% eligible) %>% 
    group_by(ChoosenStore) %>% 
    summarise(CumQty=sum(OrderQty)) %>% 
    top_n(-1, CumQty) %>% .$ChoosenStore 
    return(rbind(df, c(tail(df$OrderNum, 1)+1, 
        quantity, 
        paste0(eligible, collapse=", "), 
        choosen)))} 
# try it with the 4th line 
NewOrder(df, 7, c("S1", "S2")) 
+0

ありがとうございますagenis。 – user3117837

関連する問題