2017-07-13 1 views
0

Je me demande pourquoi personne ne m'a posé cette question, mais comment puis-je classer les entrées (ordinales) dans une table en fonction d'un ensemble de règles/arbre hiérarchisé? (peut-être avec Excel nu et pas un imbriquée si cascade)Regroupement Excel par jeu de règles classé par ordre de priorité

exemple minimal (seulement 3 de 11 ou plus de fonctionnalités montré)

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

Règles

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 

rendement:

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 

Répondre

0

Vous pouvez convertir un "ensemble de règles" en toutes les combinaisons possibles des attributs (IsCool, IsNerdy, HasChild, etc.) en traitant "Ignorer" comme 0 (zéro) ou 1 (unité). Ainsi, la première règle du jeu de règles questions serait remplacée par deux règles.

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

Bien qu'il existe seulement 8 possibilités dans les trois attributs, cette approche peut conduire à plus de 8 règles. Par exemple, dans le jeu de règles de la question, une personne avec le n-uplet de données (IsCool, IsNerdy, HasChild) donné par (1,1,1) correspondrait au groupe A et au groupe B lorsque les "ignorés" dans le rulset sont étendus de cette façon. Pour éliminer l'ambiguïté que cela provoque, il est également nécessaire d'appliquer les priorités: la correspondance au groupe A a une priorité plus élevée que celle de B, de sorte que la table de recherche inclut (1,1,1, A) en tant que ligne mais exclut (1 , 1,1, B). Avec une plus grande ensemble de règles impliquant plus d'attributs, la tâche de construire la table VLOOKUP requise à partir de la table des règles ne sera pas sans problèmes, en particulier si une approche non manuelle est souhaitée et Excel seulement doit être utilisé plutôt Excel en conjonction avec VBA.

approche alternative n'impliquant pas VBA qui traite l'ensemble de règles comme les données sont les suivantes.

Formaliser les notations introduites ci-dessus, une règle concernant les attributs de n peut être exprimé comme

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

r[i] (i=1,...,n) peut prendre des valeurs de 0, 1 ou "ignore" et G représente le groupe (l'un des A, B, C ou D dans l'exemple de la question).

Une instance de données peut de même être représentée comme

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

d[i] (i=1,...,n) prend des valeurs de 0 ou 1 (mais pas "ignore")

La règle est adaptée si

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

Il est un moyen assez évident de mettre en œuvre dans Excel comme

=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])) 

où, bien sûr, les références de cellules pertinentes sont utilisées à la place des d[i] et r[i] ci-dessus et des espaces réservés indiqués le nombre approprié de OR « s sont imbriquées à l'intérieur de la AND pour remplacer le raccourci ....

La pseudo-formule ci-dessus a une valeur de TRUE ou FALSE, la première indiquant que l'instance de données correspond à la règle et la dernière ne l'est pas. Cependant, ce n'est pas la fin de l'histoire car les règles doivent toujours être appliquées dans l'ordre de priorité.

Ainsi, l'extension de la notation plus, on suppose que les règles sont classées par ordre de priorité (règle 1 a une priorité supérieure à la règle 2, qui a une priorité supérieure à la règle 3, etc.)

Si la cellule C [ k] contient le résultat de l'application de la règle de la k-ième à une instance de données à modifier ensuite le pseudo-formule ci-dessus de telle sorte que C [k] a maintenant la formule

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

veille à ce que la règle de la kème ne peut correspondre que si aucune règle antérieure (et donc de priorité plus élevée) n'a été trouvée. (Ici la troisième partie du IF est la formule AND précédemment notée.)

La capture d'écran ci-dessous montre l'approche en action pour l'exemple de la question.

screenshot of classifying data using rules

Les cellules en bleu sont des formules. Ceux pour les valeurs TRUE/FALSE dans la seconde table implémentent la pseudo-formule discutée ci-dessus. Par exemple, la cellule F13 montre le résultat d'application de la règle 1 à l'instance de données (0,0,0) et a la formule

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

NB suivante: pas intégré doit être enroulé autour de cette formule parce qu'il n'y a La formule pour la cellule I13 montre le résultat de l'application de la règle 4 à la même instance de données et doit prendre en compte les priorités plus élevées accordées aux règles 1, 2 et 3. La formule de la cellule dans cette cellule est

=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))) 

Les formules dans les cellules G13 et H13 sont similaires à celles de I13 (à gauche en tant qu'exercice).

Par conception, il peut y avoir au plus une valeur TRUE dans chaque ligne et, si l'ensemble de règles est sain, il devrait y avoir exactement une telle valeur. Les formules dans la dernière colonne de la deuxième table font cette hypothèse au sujet du jeu de règles et choisissent simplement la valeur pertinente de la dernière colonne de la première table correspondant à n'importe quelle règle qui montre TRUE.

La formule dans la cellule J13 est

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

Les formules dans la gamme F13:J13 ont été simplement recopié les lignes de la table aux cellules F14:J20

+0

ouah! laissez-moi essayer cela et comprendre en détail ... – oal100

+0

Je suppose qu'il n'est pas possible d'arriver à la priorisation sans FI imbriqués. Mais après y avoir réfléchi, c'est une solution vraiment élégante. – oal100

0

Vous pouvez le faire en créant une clé dans vos données (par exemple Joe = "111", Charliese = "101", etc.), puis c'est j ust un vlookup contre votre jeu de règles qui contient tous les combinaisons possibles de la clé.

+0

merci pour la réponse! J'ai effectivement essayé ce modèle/approche clé. En fait il y a 11 caractéristiques (comme IsCool) qui rendent particulièrement difficile la partie "ignorer". dans le pire des cas, je dois spécifier 2^11 = 2048 combinaisons que mon cerveau ne peut pas gérer ... et d'autres ne seront probablement jamais capables de suivre ... cela fonctionne plutôt bien entre 2-4 caractéristiques. – oal100

+0

Ensuite, une macro est probablement votre meilleur pari. Avoir une variable initialement définie sur True pour chaque ligne de données, puis parcourir chaque règle, colonne par colonne pour trouver une correspondance (ignorer lorsque "ignore"). Si vous obtenez une discordance, passez à la règle suivante. Si à la fin des colonnes vous êtes toujours Vrai, vous avez trouvé une correspondance et pouvez passer à la ligne de données suivante. – NikG