Compter le nombre d'éléments uniques dans la colonne qui répondent à certains critèresSupposons que dans la classe « Grande Classe », je souhaite une formule qui compte le nombre de noms uniques de personnes dont la taille est inférieure ou égale à celle de la personne sur la ligne actuelle. Comment puis-je procéder ?
J'ai ceci :
cetteHauteur = :hauteur;
Col N Unique( :nom, :hauteur <= cetteHauteur );
Je comprends que le deuxième paramètre est le paramètre de regroupement, et qu'il est plus intuitif d'essayer de limiter ce qui est transmis au premier paramètre, mais je n'ai eu aucun succès avec tout ce que j'ai essayé jusqu'à présent.
Accès aux donnéesRe : Compter le nombre d’éléments uniques dans une colonne qui répondent à certains critèresLa fonction intégrée la plus proche qui me vient à l'esprit est Col Rank( :height, < Le problème est le suivant : cette fonction compte le nombre total de lignes à ou en dessous de cette hauteur, et non le nombre de noms uniques .
Vous pouvez aussi essayer une formule personnalisée, comme celle-ci :
thisHeight = :height; //store the current height value
// Build an associative array to collect unique names at or below thisHeight
aa = Associative Array();
For( i = 1, i <= N Rows(), i++,
If( Column("height")[i] <= thisHeight,
aa[Column("name")[i]] = 1 // This only adds to the Associative Array if this is a new, unique name
)
);
// The number of Items that have been added to the array = number of unique names
N Items( aa )
Re : Compter le nombre d’éléments uniques dans une colonne qui répondent à certains critèresJe ne sais pas si c'est possible avec les fonctions Col, car les nouvelles se comportent un peu différemment des anciennes.
As Constant(n = :name << get values);
curheight = :height;
r = Where(:height <= curheight);
N Items(Set Unique(n[r]));
Re : Compter le nombre d’éléments uniques dans la colonne qui répondent à certains critèresJ'ai essayé une méthode très similaire hier soir et JMP a planté. Je l'ai laissé tourner toute la nuit, et ce matin, la fenêtre de la table de données JMP était vide et ne répondait plus. Le Gestionnaire des tâches indique que la machine n'utilisait qu'un seul cœur et qu'il restait plus de 40 Go de RAM libre (donc pas de saturation de la RAM ni d'utilisation excessive du processeur). Ma table contient près de 400 000 lignes, je pense donc que la complexité est en O(N²).
Re : Compter le nombre d’éléments uniques dans une colonne qui répondent à certains critères@jthi Concernant mon commentaire précédent, cela ressemble également à une solution en O(N^2). (C'est vraiment dommage qu'une mauvaise formule puisse bloquer/faire planter toute la session ; j'ai perdu une bonne partie de mon après-midi de travail hier en essayant de trouver une solution similaire.)
C'est dommage que les nouvelles fonctions Col ne fonctionnent pas de la même manière. Ma question était peut-être trop simpliste : j'ai également besoin des colonnes de regroupement et je ne sais pas comment les implémenter dans cette solution. Je vais probablement devoir le faire en Python, ce qui est regrettable car la colonne ne se mettra pas à jour automatiquement et il n'est pas encore possible d'enregistrer des scripts Python dans la table.
P.-S. Dans le but d'apprendre un peu de vous à chaque interaction
– pourquoi cette approche nécessite-t-elle la fonction « As Constant() » ? Que se passerait-il sans elle ?
Re : Compter le nombre d’éléments uniques dans la colonne qui répondent à certains critèresSi vous avez besoin d'une formule, je ne suis pas certain que Python soit la solution idéale. La fonction Constant() sert justement à éviter de répéter la liste des noms sur chaque ligne.
Re : Compter le nombre d’éléments uniques dans la colonne qui répondent à certains critèresLa solution Python a fonctionné et, tout bien considéré, a été assez rapide à mettre en œuvre et à exécuter.
J'espère toujours que la fonction Col N Unique() sera retravaillée dans une future version pour être similaire aux autres.
J'aimerais bien qu'il existe un recueil de formules JMP que l'on puisse consulter. Je programme activement en VBA, AppleScript, Perl, Python et JavaScript (et un peu en C++) depuis mes 33 ans, et JSL est de loin le langage le plus difficile à apprendre et à comprendre. Je ne comprends toujours pas l'utilité de la fonction `AsConstant()` ni son fonctionnement. J'ai lu la majeure partie du guide de programmation, mais j'ai l'impression qu'il en manque un.
Re : Compter le nombre d’éléments uniques dans une colonne qui répondent à certains critèresIl est déconseillé d'évaluer des valeurs qui restent inchangées à chaque ligne d'exécution de la formule. C'est précisément le rôle de la fonction As Constant() : elle permet à JMP d'évaluer l'expression une seule fois, sur la première ligne.
En tant que constante(expr)

Je pense que vous pourriez le remplacer par (probablement pas exactement la même chose, mais assez proche)
If(Row() == 1,
n = :name << get values;
);
Re : Compter le nombre d’éléments uniques dans la colonne qui répondent à certains critèresAu risque de nous perdre dans les méandres de cette question, une dernière question…
Les formules de colonnes sont-elles effectivement évaluées une seule fois, mais chaque expression est-elle évaluée dans un contexte de tableau ?
Ou bien la formule entière est-elle réexécutée une fois par ligne, la fonction Row() indiquant quelle ligne est actuellement évaluée ?
Ou bien est-ce que je me trompe sur un point plus fondamental ? Ma représentation mentale du fonctionnement des formules dans JMP est fragmentée en éléments incompatibles…
Re : Compter le nombre d’éléments uniques dans une colonne qui répondent à certains critèresQuelqu'un qui maîtrise le fonctionnement interne de JMP pourra sans doute vous donner une réponse plus précise (peut-être @Craige_Hales ). Je les considère comme des expressions (du JSL, tout simplement) évaluées pour chaque ligne, directement dans la table de données, lorsque cela est nécessaire. Ce moment est déterminé par JMP, sauf si je supprime l'évaluation. Certaines optimisations existent, comme les fonctions Col qui ne sont évaluées (la plupart du temps) qu'une seule fois.
JMP Help propose quelques liens utiles, mais je ne trouve rapidement que celui-ci :
Re : Compter le nombre d’éléments uniques dans une colonne qui répondent à certains critèresVoici une technique pour explorer le terrier du lapin :
New Table( "Untitled",
Add Rows( 3 ),
New Column( "a",
Formula(Write( "\!nA" || Char( Row() ) );Row();),
Set Selected
),
New Column( "b",
Formula(Write( "\!nB" || Char( Row() ) );:c + :d + 100;)
),
New Column( "c",
Formula(Write( "\!nC" || Char( Row() ) );:a + 1000;)
),
New Column( "d",
Formula(Write( "\!nD" || Char( Row() ) );:a + 10000;)
),
new column( "e",
formula(write("\!nE" || char(row())); asconstant(write("\!nE as constant "|| char(row())); Q=a+b+c+d); Q;)
)
);
/*
A1 << A must be done first, every other column depends on A
A2
A3
D1
D2
D3
C1
C2
C3
B1 << B must be after C and D
B2
B3
E as constant 1 << the constant is calculated before the first cell, but using row 1
E1 << E must be last; the asconstant value uses all other columns
E2
E3
*/

Le point-virgule (;) est un opérateur JSL qui exécute une série d'instructions et renvoie la valeur de la dernière instruction. Cela signifie qu'une instruction d'affichage peut être ajoutée au début d'un calcul pour laisser une trace dans le journal.
J'ai appris plus haut que la fonction asconstant(...) est extraite avant le calcul de la première ligne, mais avec la ligne 1 comme ligne actuelle.
JMP trie également les colonnes pour déterminer lesquelles peuvent être évaluées en premier.
Re : Compter le nombre d’éléments uniques dans une colonne qui répondent à certains critèresLa colonne E serait plus logique ainsi :
New Column( "e",
formula(
Write( "\!nE" || Char( Row() ) );
As Constant( Write( "\!nE as constant " || Char( Row() ) ); a + b + c + d; );
)
)
La variable Q est inutile et masque l'utilité de la variable AsColumn.
Re : Compter le nombre d’éléments uniques dans une colonne qui répondent à certains critèresVoici un autre lien qui peut parfois s'avérer utile (n'essayez pas de tout regrouper dans une seule formule) : Utiliser JMP > Créer des formules dans JMP > Créer des formules dans JMP

Un autre avantage est que, si vous avez plusieurs formules, il est beaucoup plus facile de vérifier les résultats et, dans certains cas, de corriger les formules.