Comment identifier les minimums et les maximums dans les groupes de donnéesSupposons que je prenne tous les élèves de la grande classe et que je les mette en groupes par sexe et par âge, par exemple les garçons de 12 ans dans un groupe, les filles de 12 ans dans un autre, etc.
Avec cette configuration, j'aimerais créer une colonne de formule qui a un 1 si ce groupe a la taille maximale la plus courte pour son âge parmi les deux sexes, et un 0 sinon.
Par exemple, dans ces données :
| Groupe | Nom | Hauteur | NOUVELLE COLONNE |
| Filles de 12 ans | KATIE | 59 | 0 |
| | JEANNE | 55 | 0 |
| | JACLYNE | 66 | 0 |
| | LILLIE | 52 | 0 |
| Garçons de 12 ans | TIM | 60 | 1 |
| | JACQUES | 61 | 1 |
| | ROBERT | 51 | 1 |
La taille maximale pour les filles est de 66 et pour les garçons de 61, donc le groupe des garçons a la taille maximale la plus petite pour leur âge, donc la nouvelle colonne de formule aurait un 1 pour Tim, James et Robert, et un zéro pour Katie, Louise, Jane, etc.
Est-ce possible dans une colonne de formule ?
(Je peux partager ce que j'ai essayé, mais j'essaie d'éviter le problème xy, http://xyproblem.info ici...)
Analyse et modélisation de données de baseExploration et visualisation des donnéesRé: Comment identifier les minimums et les maximums dans les groupes de donnéesVous pouvez utiliser les agrégations Col ....
edit : si quelqu'un demandait le sexe de l'élève ayant la plus petite taille par groupe d'âge :
Utilisez d’abord Col Min pour trouver l’élève ayant la taille minimale par âge.
Utilisez ensuite Col Max pour diffuser cette connaissance parmi tous les étudiants du même sexe.
donc:
New Column( "myCol",
Formula( Col Maximum( :height == Col Minimum( :height, :age ), :sex, :age ) ),
)
Comme tu l'as demandé
une colonne de formule qui contient un 1 si ce groupe a la taille maximale la plus courte pour son âge parmi les deux sexes, et un 0 sinon
l'approche doit être corrigée pour
New Column( "myCol",
Formula(
Col Maximum(
:height == Col Min( Col Maximum( :height, :age, :sex ), :age ),
:sex,
:age
)
)
)
selon l'idée de :
- quelle est la taille maximale par âge et par sexe
- prenez les valeurs et trouvez la taille minimale (maximale) par âge
- which student?
[ah, non, nous ne voulons pas d'un étudiant au hasard, nous voulons juste un étudiant de taille maximale !]
-> replace :height with Col Maximum( :height, :age, :sex ) *) </CODE>use col max to spread the 1 to all other students with the same sex and age</STRIKE><BR /><STRIKE>définissez l'autre sexe sur 0 - ou 1, s'il y a un garçon et une fille de la même taille.</STRIKE><BR /><FONT face="comic sans ms,sans-serif" color="#999999">cette partie nous n'en avons plus besoin</FONT><BR /><FONT face="comic sans ms,sans-serif" color="#999999">... et nous avons fini exactement avec la solution de Jarmo (voir ci-dessous)</FONT><BR /><BR /></LI></UL></LINGO-BODY><LINGO-SUB id="lingo-sub-821774" slang="en-US" mode="CREATE">Ré: Comment identifier les minimums et les maximums dans les groupes de données</LINGO-SUB><LINGO-BODY id="lingo-body-821774" slang="en-US" mode="CREATE"><P>Problème XY :<BR /> merci : )</P></LINGO-BODY><LINGO-SUB id="lingo-sub-821776" slang="en-US" mode="CREATE">Ré: Comment identifier les minimums et les maximums dans les groupes de données</LINGO-SUB><LINGO-BODY id="lingo-body-821776" slang="en-US" mode="CREATE"><P>Wow, ça semble fonctionner, mais mon cerveau n'arrive même pas à comprendre comment cela fonctionne...</P><P> </P><P>Laissez-moi essayer de le déballer ici et peut-être que vous pourrez m'aider à comprendre --</P><P> </P><P>Commençant par : Col Maximum( :height == Col Minimum( :height, :age ), :sex, :age )</P><P> </P><P>Col Minimum( :height, :age ) --> renvoie la taille minimale de tous les élèves de cet âge</P><P> </P><P>:height == Col Minimum( :height, :age ) --> renvoie vrai/faux (1/0) si la colonne de hauteur de cette ligne correspond à cette hauteur minimale</P><P> </P><P>Col Maximum( <1 ou 0 pour cette ligne> , :sex, :age ) --> euh... cela n'a aucun sens, je pensais que le maximum de colonne fonctionnait en regroupant les données par les colonnes de regroupement (:sex, :age), puis trouve le maximum de colonne des valeurs ou de la colonne dans le premier argument -- qui n'est maintenant qu'un seul vrai/faux ou 1/0 -- puis renvoie la valeur maximale correspondante pour le groupe de cette ligne, c'est-à-dire les valeurs de cette ligne pour :sex et :age.</P><P> </P><P>C'est évidemment faux, qu'est-ce qui me manque ici ?</P><P> </P><P> </P><P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-821779" slang="en-US" mode="CREATE">Ré: Comment identifier les minimums et les maximums dans les groupes de données</LINGO-SUB><LINGO-BODY id="lingo-body-821779" slang="en-US" mode="CREATE"><P>Il existe de nombreuses façons de procéder en utilisant par exemple différentes combinaisons de fonctions statistiques col (comme déjà montré). Voici une autre option (je pense qu'elle devrait faire ce que vous recherchez)</P>
<P> </P>
<PRE><CODE class=" language-jsl">Col Min(Col Max(:height, :age, :sex), :age) == Col Max(:height, :age, :sex)
First Col Min() recherche le Col Max() sur les groupes d'âge et de sexe SUR l'âge et cela est ensuite comparé aux maximums des groupes d'âge et de sexe et s'il est identique au minimum des groupes d'âge -> la valeur est 1.
Pour mieux les comprendre, je pense qu'il est utile de les écrire tous séparément et de les rendre plus faciles à comprendre, dans ce cas :
First column with Col Max(:height, :age, :sex) (max_height_for_agesex)
- Next column then utilizes that
Col Min(:max_height_for_agesex, :age) age_minmax_age
- And the final one is the comparison of these two
:max_height_for_agesex == :age_minmax_age
Ré: Comment identifier les minimums et les maximums dans les groupes de donnéesMerci @jthi – mais je suis toujours confus.
Commençons par ceci :
Col Min(Col Max(:height, :age, :sex), :age) == Col Max(:height, :age, :sex)
Lorsque JMP évalue la valeur « Col Max(:height, :age, :sex) », que renvoie-t-il ? Une valeur unique ? Ou une liste ?
Je peux créer une nouvelle colonne avec cela comme formule et cela produit une liste de valeurs qui se retrouvent dans les lignes de la colonne.
Mais dans une formule, il semble renvoyer une valeur unique, par exemple :
a = col max(:height, :name);
type(a);
... renvoie « Nombre ».
Et si je crée un nouveau script et que j'entre :
a = col max(:height, :name); <BR />show(a);
il indique "numéro de ligne non valide", mais sans le ", :name", cela fonctionne bien en renvoyant 70. Il semble que JMP fasse une sorte de signification contextuelle spécifique avec ces fonctions. Comment cela fonctionne-t-il ? Est-ce expliqué quelque part ?
Ré: Comment identifier les minimums et les maximums dans les groupes de donnéeslorsque vous exécutez la formule d'une colonne de formule dans une cellule, elle calcule la valeur de la ligne actuelle.
Lorsque vous l'exécutez en JSL, il le calcule pour la ligne actuelle.
Cela semble être la même chose. Mais la valeur par défaut pour « ligne actuelle » est « ligne 0 » - c'est-à-dire aucun numéro valide.
Vous pouvez également vérifier le calcul pour n'importe quelle ligne - différente de la valeur par défaut « 0 ».
Il suffit de mettre un row()=xy devant votre calcul et le calcul sera effectué pour la ligne xy .
donc, par exemple
row()=5;
col max(:height, :age)
retournera 66.
:age dans la ligne=5 est 12 et la taille maximale pour l'âge = 12 est 66 .
Ré: Comment identifier les minimums et les maximums dans les groupes de donnéesJe suppose que cela fonctionne comme ceci :
Col ... parcourt d'abord toutes les lignes et stocke les résultats du premier argument.
Il le calcule ligne par ligne - par exemple si le premier argument est aléatoire uniform() .
De plus, il stocke une table de recherche pour le groupe supplémentaire par arguments.
Il divise ensuite les données en sous-ensembles, calcule les valeurs agrégées, puis répartit les valeurs agrégées dans les lignes respectives.
Ré: Comment identifier les minimums et les maximums dans les groupes de données
Lorsque JMP évalue la valeur « Col Max(:height, :age, :sex) », que renvoie-t-il ? Une valeur unique ? Ou une liste ?
Valeur unique.
Si vous créez un script et souhaitez tester ce qui se passe, vous devez utiliser Row() SI vous utilisez des colonnes (sans colonnes, cela fonctionnera car JMP sait utiliser toutes les lignes). Row() sera 0 par défaut dans JMP, vous devez donc le changer par exemple en Row() = 1. Je pense avoir vu une documentation à ce sujet dans l'aide JMP ou l'index des scripts, mais je n'ai aucune idée de l'endroit (cela pourrait être lié aux fonctions statistiques Row(), For Each Row ou Col).
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
max_height = Col Max(:height); // works fine as no by var used and uses all rows
Show(Row());
Col Max(:height, :age); // won't work as JMP doesn't know which age to use -> it needs row information
Row() = 1;
cur_age = :age;
cur_maxheight = Col Max(:height, :age);
Write("\!Max height for age ", cur_age, " is ", cur_maxheight);Ré: Comment identifier les minimums et les maximums dans les groupes de donnéesIl semble que vous disiez que JMP encapsule l'intégralité de la formule de colonne dans une boucle qui itère « Row() » sur les lignes du tableau, calculant une valeur pour chaque ligne.
Cela *aurait* du sens, sauf pour cette expression :
Col Min(Col Max(:height, :age, :sex), :age)
... qui, selon cette logique, lorsque Row() est défini sur i=1, il calculerait alors Col Max() comme la plus grande valeur dans la colonne :height de toute la table où :age[i] == :age[1] et :sex[i] == :sex[1], ce qui renvoie un seul nombre. Ensuite, il essaie de calculer Col Min() de ce nombre unique, qui par définition ne peut être que ce nombre. J'ai vraiment du mal à donner un sens à cela.
Je continue à penser que Col Max() doit renvoyer une liste, alors Col Min() pourrait regarder toutes les lignes de cette liste où :age[i] == :age[1].
Mais mon idée ici nécessite que JMP fasse quelque chose de similaire à ce que fait Perl, en gardant essentiellement une trace de si quelque chose est appelé dans un contexte scalaire ou de liste, c'est-à-dire si une fonction est utilisée d'une manière qui attend une liste en retour, elle renvoie une liste, sinon elle renvoie un scalaire. De cette façon, Col Max() pourrait ici renvoyer une liste pour Col Min(), qui à son tour renverrait une valeur scalaire.
Je suppose qu'il me manque quelque chose ici et que je n'arrive pas à mettre le doigt dessus.
Ré: Comment identifier les minimums et les maximums dans les groupes de donnéesNon, l’idée n’est PAS que JMP parcoure UNE FOIS ligne par ligne le tableau et calcule l’expression entière.
Ré: Comment identifier les minimums et les maximums dans les groupes de donnéesPour étudier ce que fait JMP, créons d'abord une très petite table de données...
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt = dt0 << Clear Select << Select Rows( [2, 10, 11, 25] ) << Subset( Selected Rows( 1 ), Selected columns only( 0 ) );
nr = n rows(current data table());
... et une colonne de formule avec quelques fonctionnalités de journal :
New Column( "test", Formula(Col Min(Write( "\!nmin:" || (Char( Row() )) );if(row()==nr, write("\!n") );:height, :age)));la sortie:

Ainsi, pour ce cas, JMP exécute le code plusieurs fois.
On se demandera plus tard...
Ré: Comment identifier les minimums et les maximums dans les groupes de donnéesVérifions maintenant avec
New Column( "test",
Formula(
Col Min(
Write( "\!nmin:" || (Char( Row() ) || "\!n\!n") );
Col Max(
Write( "max:" || (Char( Row() ) || "\!n") );
:height;,
:age,
:sex
);,
:age
)
)
)
... et nous obtenons *)

qui montre:
- pour l'exemple simple, JMP évalue le premier argument de Col Min pour chaque ligne
- pour la deuxième version, JMP évalue le premier argument de Col Min pour chaque ligne - et comme il y a une autre agrégation Col... à l'intérieur de ce code, celle-ci est suivie de la boucle ColMax : premier argument de Col Max pour chaque ligne
À la fin, JMP connaît la valeur de ColMax(...) pour chaque ligne et peut alors évaluer Col min avec ces valeurs.
C'est plus ou moins ce que vous dites - avec le contexte de la liste. Mais je pense que JMP stocke les résultats dans le contexte de la table de données. De telle sorte qu'il peut combiner les VALEURS avec des informations supplémentaires comme row(), row states() ..
mais quelqu'un de JMP - ou @jthi - pourrait mieux expliquer...
*) encore une fois : plusieurs fois :
plus de détails peuvent être trouvés ici :
https://community.jmp.com/t5/Discussions/Statistical-functions-Col-Mean-for-example-posslessly-bugged-on/mp/613887/highlight/true#M81398
Ré: Comment identifier les minimums et les maximums dans les groupes de donnéesune autre façon de tester l'exécution du code :
i = 0;
j = 0;
New Column( "test",
Formula(
Col Min(
i++;
Col Max(
j++;
:height;,
:age,
:sex
);,
:age
)
)
);
// too early
Show( i );
Show( j );
Current Data Table() << run formulas();
// after calculating the values
Show( i );
Show( j );

i = 5 x 4
j = 5 x 5 x 4
Ré: Comment identifier les minimums et les maximums dans les groupes de données-
Ré: Comment identifier les minimums et les maximums dans les groupes de donnéesLes fonctions statistiques Col ont leur propre magie que d'autres fonctions n'ont pas, par exemple elles ont une mise en cache interne et prennent en charge les byvars. https://www.jmp.com/support/help/en/18.0/#page/jmp/statistical-functions.shtml#
Ré: Comment identifier les minimums et les maximums dans les groupes de donnéesOui, cette manière intelligente de préparer les données est extrêmement utile :
Exemples de la façon dont la magie opère :
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << Clear Select << Select Rows( Index( 5, 40 ) ) <<DELETE rows=""></DELETE>newCol << Set Formula(Col Min(Print(row());:height,:age)); // 2 x 4<BR /><BR />newCol << Set each value(Col Min(Col Max(Print(row());:height,:sex),:age)); // 4 + 4
newCol << Set Formula(Col Min(Col Max(Print(row());:height,:sex),:age)); // 2 x 4 + 4
Assurez-vous de ne pas tomber sur l'un de ces robinets :
i=1;<BR />newCol << set each value (Col Min(Print("X");:height,:age)); // 16 = 4 x 4
newCol << set Formula (Col Min(Print("X");:height,:age)); // 20 = 5 x 4<BR />newCol << set Formula (Col Min("x";Print(3);:height,:age)); // 20 = 5 x 4
newCol << Set Formula(Col Min(i;Print(row());:height,:age)); // 20 = 5 x 4<BR />
newCol << set each value (Col Min(Col Max(Print("X");:height,:sex),:age)); // 80 = 5 x 4 x 4
newCol << set Formula (Col Min(Col Max(Print("X");:height,:sex),:age)); // 100 = 5 x 5 x 4<BR />newCol << set Formula (Col Min(Col Max("X";Print(3);:height,:sex),:age)); // 100 = 5 x 5 x 4
newCol << Set Formula(Col Min(Col Max(i;Print(row());:height,:sex),:age)); // 100 = 5 x 5 x 4
Les agrégations de Col deviennent prudentes lorsqu'elles voient
puis ils passent à une vitesse réduite et calculent chaque valeur pour chaque ligne (+1)... dans un arbre hiérarchique.
Ré: Comment identifier les minimums et les maximums dans les groupes de donnéesJe ne suis pas sûr d'être assez intelligent pour suivre tout ce que vous faites ici --
Il semble que vous soyez d'accord avec moi ? C'est-à-dire que les fonctions Col... font des choses différentes dans des contextes scalaires et de liste ?
Ré: Comment identifier les minimums et les maximums dans les groupes de donnéesAttendons un an et rediscutons : les choses pourraient changer.