2017-07-13 4 views
0

なぜ誰もこれに尋ねなかったのですが、優先度の高いルールセット/ツリーに従ってテーブル内の(序数)エントリをどのように分類するのでしょうか? (おそらく裸Excelではなく、カスケード場合、ネストされた)優先度の高いルールセットによるExcelのグループ化

最小例(図示せ11の以上の特徴のわずか3)

Name  | IsCool | IsNerdy | HasChild 
Joe  | 1  | 1  | 1 
Charliese | 1  | 0  | 1 
Peter  | 1  | 0  | 0 
Jonas  | 0  | 0  | 0 

ルール得

Priority | IsCool | IsNerdy | HasChild | => Group 
1.  | 1  | 1  | ignore | A (at least cool&nerdy) 
2.  | ignore | ignore | 1  | B (not A, but has a child) 
3.  | 1  | 0  | 0  | C (only cool) 
4.  | ignore | ignore | ignore | D (everything else) 

stop after first match 

Name  | IsCool | IsNerdy | HasChild | Group 
Joe  | 1  | 1  | 1  | A 
Charliese | 1  | 0  | 1  | B 
Peter  | 1  | 0  | 0  | C 
Jonas  | 0  | 0  | 0  | D 

答えて

0

"無視"を0(ゼロ)または1(1)として扱うことで、ルールセットを属性(IsCool、IsNerdy、HasChildなど)のすべての可能な組み合わせに変換できます。

したがって、質問ルールセットの最初のルールは2つのルールに置き換えられます。

IsCool ¦ IsNerdy ¦ HasChild¦ Group 1 ¦ 1 ¦ 0 ¦ A 1 ¦ 1 ¦ 1 ¦ A

の3つの属性間の唯一の8の可能性がありますが、このアプローチは、8つの以上のルールにつながることができます。たとえば質問のルールセットでは、(1,1,1)で与えられたデータタプル(IsCool、IsNerdy、HasChild)を持つ人物は、ルールセット内の「無視」が展開されるときにグループAとグループBの両方に一致しますこの方法では。グループAとBとのマッチングがBよりも優先されるので、ルックアップテーブルは(1,1,1、A)を行として含むが除外(1 、1,1、B)。

より多くの属性を含むより大きなルールセットでは、ルールテーブルから必要なVLOOKUPテーブルを構築するタスクは、特に非手動アプローチが望ましく、ExcelだけでなくExcel VBAと共に

代替案ルールセットをデータとして扱うVBAを伴わないものは次のとおりです。上記導入された表記法を定式化

は、n個の属性を含むルールがr[i] (i=1,...,n)01又は"ignore"Gの値を取ることができる

(r[1],r[2],...,r[n],G) 

として表すことができ、グループ(A、B、Cのいずれかを表します。または質問の例ではD)。

データのインスタンスが同様に存在

r[i] = "ignore" OR "d[i] = r[i]" for each i from 1 to n 

場合、ルールが一致するd[i] (i=1,...,n)0または1(ただし"ignore")の値をとる

(d[1],d[2],...,d[n]) 

として表すことができます。これをExcelで実装するのはかなり明白な方法です

もちろん、関連するセルの参照が ...速記を置き換えるために上に示した d[i]r[i]プレースホルダ及びsは ANDの内側にネストされている OR」の適切な数の代わりに使用され、
=AND(OR(r[1]="ignore",d[1]=r[1]),OR(r[2]="ignore",d[2]=r[2]),...,OR(r[n]="ignore",d[n]=r[n])) 

上記の疑似式の値は、TRUEまたはFALSEのいずれかで、前者はルールに一致するデータインスタンスを示し、後者はそうでないことを示します。

しかし、これはルールが依然として優先順位順に適用される必要があるため、ストーリーの終わりではありません。

そこで、さらに表記を拡張、ルールは優先順にリストされていることを前提と(ルール1等ルール3、より高い優先度を有するルール2、より高い優先順位を有する)

セルC [場合k]がC [k]は、今式

=IF(OR(C[1],...,C[k-1]),FALSE,AND(...)) 

はそのk番目のルールを確実に有するように、上記擬似式を修正し、データのインスタンスにk番目のルールを適用した結果を保持しています以前の(したがってより高い優先度の)ルールが一致しない場合にのみマッチさせることができます。ここで、IFの3番目の部分は、前述のANDの式です。

以下のscreengrabは、質問の例についての実際の取り組みを示しています。

screenshot of classifying data using rules

青のセルは数式です。 2番目の表のTRUE/FALSE値のものは、上記の擬似式を実装しています。例えば、細胞F13は(0,0,0)データインスタンスにルール1を適用した結果を示しており、以下の式

=AND(OR($C$5="Ignore",$C$5=$C13),OR($D$5="Ignore",$D$5=$D13),OR($E$5="Ignore",$E$5=$E13)) 

NB有する:いいえがあるので、ニーズがこの式に巻き付けされるNOの場合をルール1よりも優先順位が高いルール

セルI13の式は、ルール4を同じデータインスタンスに適用した結果を示しており、ルール1,2および3に応じたより高い優先順位を考慮する必要があります。このセルの中には、

=IF(OR($F13:H13),FALSE,AND(OR($C$8="Ignore",$C$8=$C13),OR($D$8="Ignore",$D$8=$D13),OR($E$8="Ignore",$E$8=$E13))) 

セルG13およびH13の式は、I13の式に似ています(練習として残しました)。

各行に最大でも1つのTRUE値があり、ルールセットが健全な場合は、そのような値が1つだけ存在する必要があります。 2番目の表の最後の列にある数式は、ルールセットに関するこの推測を行い、TRUEと表示されているルールに対応する最初の表の最後の列から関連する値を単純に取り出します。細胞J13

式は範囲F13:J13

=INDEX(F$5:F$8,SUMPRODUCT(1*(F13:I13),F$12:I$12)) 

式は単に細胞応答をF14:J20

+0

うわー!私はこれを試してみて、詳細を理解してください... – oal100

+0

入れ子にされたIFなしで優先順位をつけることはできないと思います。しかし、それについて考えた後、これは真にエレガントな解決策です。 – oal100

0

データにキーを作成する(Joe = "111"、Charliese = "101"など)、次にjあなたのルールセットとの間には、すべてのキーの組み合わせが含まれています。

+0

おかげでテーブルの行を下にコピーされています!私は実際にこのパターン/キーアプローチを試みました。実際には、(無視する)部分を特に困難にする11の機能(IsCoolなど)があります。最悪のシナリオでは、2^11 = 2048の組み合わせを指定する必要があります。私の脳はそれを扱うことができません。他の人はおそらくそれに従うことはできません。 – oal100

+0

マクロがベスト・ベットの可能性が高いです。各データ行に対して最初にTrueに設定された変数を持ってから、各ルールを繰り返して列ごとに検索します(無視すると無視されます)。不一致が生じた場合は、次のルールに進みます。列の最後までまだTrueであれば、一致が見つかり、次のデータ行に移動できます。 – NikG

関連する問題