2017-09-24 3 views
-1

私は以下のようなテーブルを持っています。各行には店舗ID、クーポンの1つにつき割引率%があります。各ストアは複数のクーポンを持つことができますが、(store + discount%)は主キーです。私はトップ10のクーポンを(ディスカウント%を減らすことによって)探したいと思っていますが、同じ店から2つのクーポンしか得られません。これを行う最も効率的な方法は何ですか?私のロジックは、データを複数回ソートすることです。より効率的な方法がありますか?トップエントリを提供するデータのソート

df <- data.frame(Store=c("Lowes","Lowes","Lowes","Lowes","HD","HD","HD","ACE", 
         "ACE","Misc","Misc","Other","Other","Last","Last","Last"), 
       `discount_%`=c("60%","50%","40%","30%","60%","50%","40%","30%", 
           "20%","50%","30%","20%","10%","10%","5%","3%"), 
       check.names = FALSE) 
  1. 私の解決策は、店を無視して、割引でテーブルをソート IDを作成することです:私は、サンプル・データR.

    でこれを行うしたいと思います。 IDは降順でクーポンを表します

  2. 次にストアと割引によって、店舗別に クーポンのランキングを持つID2を作成します。
  3. その後、ID2> 2
  4. はその後、これを試してみてくださいトップ10行

答えて

2

を取るIDで

  • をテーブルに並べ替えるすべての行フィルタリング:

    df$`discount_%` <- as.numeric(gsub("%","",df$`discount_%`)) 
    
    require(data.table) 
    setDT(df)[order(-`discount_%`),.SD[1:2],by=Store][order(-`discount_%`)[1:10],] 
    

    出力:

    Store discount_% 
    1: Lowes   60 
    2: HD   60 
    3: Lowes   50 
    4: HD   50 
    5: Misc   50 
    6: Misc   30 
    7: ACE   30 
    8: ACE   20 
    9: Other   20 
    10: Other   10 
    

    特殊文字なしでRでデータを扱う方が簡単ですしかし、パーセント記号を追加する必要がある場合は、次のようなものを試してみてください。

    paste0(df$`discount_%`,"%") 
    
  • +0

    あなたのロジックは何ですか?私が言及したものよりも良い論理はありますか? – user2543622

    +0

    @ user2543622 - サンプルデータに余分な行を追加して、ソリューションの耐誤り性を向上させました。基本的に、これは各店舗から最大2つの最高割引値を受け取り、割引の数値で出力を注文します。これは、リストされた割引の合計数を1 – www

    +0

    にしていただきありがとうございます。しかし、より少ないコンピューティングパワーを使用してこの問題を解決する最良のロジックは何ですか。私はあなたのコードに感謝しますが、最高のロジックを知りたいです。何十億行もあると仮定します。この問題を解決する最も効率的な方法は何でしょうか。 – user2543622

    関連する問題