Comment utiliser la formule Col Maximum avec une condition "où"Salut, j'ai un problème où je veux formuler une nouvelle colonne comme référence pour tous les autres pays. S'il y a plus de lignes pour le pays, je veux en prendre la valeur maximale comme référence. Voir l'exemple ci-dessous pour plus de précisions.
Le genre de données ressemble à ceci :
Pays Période de valeur
A 10 201301
A 30 201301
B 20 201301
C 50 201301
D 40 201301
Ce que je veux obtenir (avec la formule de la cellule) : Col Maximum (:value, :period, :country) où :pays == "A"
Production:
Pays Période de valeur Benchmark
A 10 201301 30
A 30 201301 30
B 20 201301 30
C 50 201301 30
D 40 201301 30
Comme vous pouvez le voir, je veux comparer la valeur maximale du seul pays A.
J'ai essayé Col Maximum (:value, :period, :country == "A") et il renverra "50"
Col Maximum (:value, :period, :country) et Col Maximum (:value, :period, :country == "A") renvoient tous les deux "50"
Je suis presque sûr qu'il existe une solution simple pour cela!
J'espère que vous pouvez aider!
Merci merci!
Re : Comment utiliser la formule Col Maximum avec une condition "où"Merci.Re : Comment utiliser la formule Col Maximum avec une condition "où"Col Maximum() n'est viable que dans une formule, où un résultat de séparation par ligne est la sortie.Pour faire ce que vous voulez, utilisez la fonction Summarize().
Voir:
Aide==>Index des scripts==>Résumer
Re : Comment utiliser la formule Col Maximum avec une condition "où"Salut Mark,
essayé d'obtenir un poids maximum par âge ou par sexe, mais n'a produit qu'une seule valeur dans le script suivant.
par âges, il y avait 6 âges différents, pour chacun d'eux, j'aimerais calculer le poids maximum pour chaque âge.
Names Default To Here( 1 );
Clear Log();
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
max_weight_by_age = Col Max( :weight, :age );
max_weight_by_sex = Col Max( :weight, :sex );
Re : Comment utiliser la formule Col Maximum avec une condition "où"Je pourrais ajouter cette formule à une nouvelle colonne dans l'exemple de table de données Big Class :
Col Max( :weight, :age )
Re : Comment utiliser la formule Col Maximum avec une condition "où"Salut Mark,
Pouvez-vous donner un exemple sur la façon d'utiliser le lors de l'utilisation de col Max ?
Merci.Re : Comment utiliser la formule Col Maximum avec une condition "où"Voir Aide > Index des scripts > Fonctions :

Re : Comment utiliser la formule Col Maximum avec une condition "où"Merci Jim, je voulais dire résumer seulement. Comment je fais est (deux commandes jsl):
Résumez sur la colonne, créez un nouveau tableau avec des valeurs (min/max/ou toute autre statistique pour la colonne).
Ensuite, je mets à jour la table principale à l'aide de la table résumée en faisant correspondre les entrées de ligne.
J'étais juste curieux de savoir s'il existe une option conditionnelle dans la commande Max col() qui peut identifier des valeurs de colonne uniques et éliminer le besoin de cette étape supplémentaire. (éliminerait une table supplémentaire et 2 marches supplémentaires).
Apprécier ton aide.
Re : Comment utiliser la formule Col Maximum avec une condition "où"J'utilise généralement la fonction Summarize(), plutôt que Summary Platform, pour déterminer facilement les niveaux trouvés dans une colonne.Ensuite, à partir de là, il vous suffit de générer la formule dont vous avez besoin pour faire le travail.
Re : Comment utiliser la formule Col Maximum avec une condition "où"Supposons que la colonne pays ait plusieurs noms et que je ne connaisse pas toutes les valeurs possibles. Comment cette requête peut-elle être modifiée pour le faire.
Je peux le faire en créant un tableau récapitulatif, puis en mettant à jour le tableau, mais cela semble être une méthode inefficace, j'étais curieux de savoir si cela pouvait être fait en une seule étape comme celle-ci.
Merci d'avance.
Re : Comment utiliser la formule Col Maximum avec une condition "où"Désolé pour la réponse tardive! Merci pour la solution !Re : Comment utiliser la formule Col Maximum avec une condition "où"Compte tenu de la façon dont vous avez exprimé vos besoins, en supposant que vous savez quel est le pays qui a les entrées multiples.
dt = Current Data Table();
rowperiod = :Period[Row()];
Max(
:Value[dt << get rows where(
:Country == "A" & :period == rowperiod
)]
);
Re : Comment utiliser la formule Col Maximum avec une condition "où"
@hogi a écrit:y a t-il commande en une ligne supprimer la femelle du calcul de la moyenne, mais écrire les valeurs dans les lignes respectives avec "femelle" ?
Je veux dire, quelque chose comme :
Col Mean( :weight, :age, where( :sex == "M" ) )
?
Re : Comment utiliser la formule Col Maximum avec une condition "où"Appliquez un If() à la colonne :weight de l'équation

col Mean( if(:sex=="M", :weight,.), :age)
Re : Comment utiliser la formule Col Maximum avec une condition "où"Fantastique!
Et tellement logique - quand on le voit !
Je suis très déçu de moi-même de ne pas avoir trouvé cette solution par moi-même.
Re : Comment utiliser la formule Col Maximum avec une condition « où »Hm, après un certain enthousiasme, je me suis un peu calmé.
Il semble que le if à l'intérieur de l'agrégation Col le rend très lent - surtout s'il y a une comparaison de caractères à l'intérieur du if - et surtout x 2 s'il y a une conversion char(num). Ensuite, les échelles de temps ~ quadratiques avec l'augmentation de la taille de la table.
Le point positif : Col Median (que j'utilise la plupart du temps) n'est pas affecté par ce "bug":)
Existe-t-il une solution simple pour Col Min, max, moyenne... ?
Sinon, j'écrirai un souhait pour implémenter une manière officielle de calculer Col xyz avec une condition where ...
Ce serait beaucoup plus rapide si l'ensemble de données était d'abord réduit ( où ), puis agrégé ( Col xyz ), puis les valeurs distribuées sur toutes les lignes respectives.

Voir plus...Names Default To Here( 1 );
If( Is Empty( mydt ),
mydt = Open( "$SAMPLE_DATA/Big Class.jmp" )
);
trialRun = 0;
tryAgain = Function( {},
trialRun += 1;
Rownumbers = N Rows( mydt );
t1 = HP Time();
mydt << New Column( "col A", Formula( Col Mean( :weight ), :sex ) );
t2 = HP Time();
mydt << New Column( "col B", Formula( Col Mean( If( :age == 12, :weight, . ), :sex ) ) );
t3 = HP Time();
mydt << New Column( "col C", Formula( Col Mean( If( :sex == "M", :weight, . ), :age ) ) );
t4 = HP Time();
mydt << New Column( "col D", Formula( Col Mean( If( Char( :age ) == "12", :weight, . ), :age ) ) );
t5 = HP Time();
mydt << New Column( "col E", Formula( Char( :age ) == "12" ) );
t6 = HP Time();
tt1 = Round( (t2 - t1) / 1000000, 4 );
tt2 = Round( (t3 - t2) / 1000000, 4 );
tt3 = Round( (t4 - t3) / 1000000, 4 );
tt4 = Round( (t5 - t4) / 1000000, 4 );
tt5 = Round( (t6 - t5) / 1000000, 6 );
If( trialRun == 1,
tt1Ref = tt1;
tt2Ref = tt2;
tt3Ref = tt3;
tt4Ref = tt4;
tt5Ref = tt5;
RNref = Rownumbers;
);
tr1 = Round( tt1 / tt1Ref );
tr2 = Round( tt2 / tt2Ref );
tr3 = Round( tt3 / tt3Ref );
tr4 = Round( tt4 / tt4Ref );
tr5 = Round( tt5 / tt5Ref );
RNratio = Round( RowNumbers / RNref );
Wait( 0.1 );
Try( mydt << delete columns( "col A", "col B", "col C", "col D", "col E" ) );
Wait( 0.1 );
mydt = mydt << Concatenate( mydt, mydt, mydt );
Wait( 0.1 );
If(
ex = New Window( "results",
<<TYPE></TYPE></CODE><NOSCRIPT><CODE class=" language-jsl"><DIV class="lia-spoiler-noscript-container"><DIV class="lia-spoiler-noscript-content">Les noms par défaut sont ici( 1 ); Si( est vide( mydt ), mydt = Open( "$SAMPLE_DATA/Big Class.jmp" ) ); trialRun = 0; tryAgain = Function( {}, trialRun += 1; Rownumbers = N Rows( mydt ); t1 = HP Time(); mydt << Nouvelle colonne( "col A", Formule( Col Mean( :weight ), :sex ) ); t2 = HP Time(); mydt << Nouvelle colonne( "col B", Formule( Col Mean( If( :age == 12, :weight, . ), :sex ) ) ); t3 = HP Time(); mydt << Nouvelle colonne( "col C", Formule( Col Mean( If( :sex == "M", :weight, . ), :age ) ) ); t4 = HP Time(); mydt << Nouvelle colonne( "col D", Formule( Col Mean( If( Char( :age ) == "12", :weight, . ), :age ) ) ); t5 = HP Time(); mydt << Nouvelle colonne( "col E", Formule( Char( :age ) == "12" ) ); t6 = Heure HP(); tt1 = Arrondi( (t2 - t1) / 1000000, 4 ); tt2 = Arrondi( (t3 - t2) / 1000000, 4 ); tt3 = Arrondi( (t4 - t3) / 1000000, 4 ); tt4 = Arrondi( (t5 - t4) / 1000000, 4 ); tt5 = Arrondi( (t6 - t5) / 1000000, 6 ); Si( trialRun == 1, tt1Ref = tt1; tt2Ref = tt2; tt3Ref = tt3; tt4Ref = tt4; tt5Ref = tt5; RNref = Numéros de ligne; ); tr1 = Arrondi( tt1 / tt1Ref ); tr2 = Arrondi( tt2 / tt2Ref ); tr3 = Round( tt3 / tt3Ref ); tr4 = Round( tt4 / tt4Ref ); tr5 = Round( tt5 / tt5Ref ); RNratio = Round( RowNumbers / RNref ); Wait( 0.1 ); Try( mydt << delete columns( "col A", "col B", "col C", "col D", "col E" ) ); Wait( 0.1 ); mydt = mydt << Concatenate( mydt, mydt, mydt ); Wait( 0.1 ); If( ex = New Window( "results", < <TYPE></TYPE></DIV></DIV>
In a previous version I had "ms" in the table instead of seconds. Unfortunately, it's 1000x more severe ...
Re : Comment utiliser la formule Col Maximum avec une condition "où"Question intéressante - toujours en attente d'une réponse ?
Il existe un ensemble de messages avec des questions similaires sur la façon de restreindre le Col ... agrégation fonctions à un sous-ensemble spécifique.
(principalement : limitez-les au sous-ensemble de lignes non exclues)
Calculer la moyenne des colonnes tout en limitant les observations utilisées
JMP10 : les fonctions Col Max() et Col Min() ont renvoyé les données de la ligne exclue
Fonctions col et états de ligne
L'idée:
Si l'on s'intéresse à la taille moyenne, on peut agréger sur toutes les lignes - ou on peut agréger les entrées masculines et féminines séparément.
Pour le second, la solution est presque aussi simple que pour le premier : il suffit d'utiliser une variable GroupBy supplémentaire pour séparer les données souhaitées et indésirables.
Mais, ce dont un utilisateur a souvent besoin en plus : les valeurs doivent apparaître dans toutes les lignes respectives (c'est-à-dire également pour les femmes).
[L'exemple avec la colonne de référence dans le message d'origine illustre pourquoi un tel comportement pourrait avoir du sens.]
Avec GroupBy, il est facile d'obtenir les valeurs correctes - mais comment les répartir sur TOUTES les lignes.
S'il y a quelque chose comme une table de recherche derrière un Col ... agrégation fonction, la fonction utilise le même identifiant
1) pour diviser les lignes en différents groupes pour l'agrégation ("M" / "F") :
Judy est une femme, le poids dans la rangée de Judy doit être inclus dans poids moyen femme
2) comme index lors de la lecture d'une entrée de la table de recherche ("M" / "F") :
Judy est une femme, la nouvelle colonne doit contenir poids moyen femme dans la rangée de Judy
Ainsi, les hommes et les femmes obtiennent les mêmes valeurs, car l'identifiant est le même (moyenne1) - ou ils obtiennent des valeurs différentes car l'identifiant est différent (moyenne2).
donc :
Un utilisateur Jmp peut utilisez la fonction GroupBy pour supprimer des valeurs du calcul via :
- calculer différentes valeurs pour différents sous-groupes
- vider les résultats indésirables
mais ensuite il obtient
- obtenir différentes valeurs pour différents sous-groupes
gratuitement - même s'il n'a pas commandé cette option (OK, le code raconte une autre histoire - mais réfléchissons à ce que l'utilisateur voulait) 
Y a-t-il un commande en une ligne supprimer la femelle du calcul de la moyenne, mais écrire les valeurs dans les lignes respectives avec "femelle" ?
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << New Column("mean1", Formula(Col Mean(:weight, :age)));
dt << New Column("mean2", Formula(Col Mean(:weight, :age, :sex)));
dt << New Column("mean2", Formula(If(:sex=="M", Col Mean(:weight, :age, :sex))));
dtM = dt << subset( Rows( dt << get rows where( :sex== "M" ) ), selected columns( 0 ));
dtM << New Column("mean_M", Formula(Col Mean(:weight, :age)));
dt << Update(
With( dtM ),
Match Columns(:age = :age ),
Add Columns from Update Table( :mean_M ),
Replace Columns in Main Table( None )
);
Re : Comment utiliser la formule Col Maximum avec une condition "où"Une approche pour accélérer les choses en ordres de grandeur (!!!):
Au lieu du très lent Col Mean avec la comparaison de caractères à l'intérieur de l'instruction if :
mydt << New Column( "col C", Formula( Col Mean( If( :name=="Robert", :weight, . ), :age ) ) );
utiliser @cwillden L'astuce de : utilisez la comparaison comme argument GroupBy :
Résolu : Re : Obtenir les lignes qui satisfont une condition dans une formule de colonne - JMP User Community
mydt << New Column( "col C", Formula(if(:name=="Robert" , Col Mean( :weight, :age, :name=="Robert" ),. ) );
pour diviser les données en 2 groupes : données souhaitées et indésirables (capture d'écran ci-dessous avec @10k lignes -> Facteur 2000 plus rapide 
.. puis supprimez les résultats indésirables via l'instruction if en dehors de l'agrégation Col Mean.
Avec la comparaison pour la colonne :sexe cette approche serait trop sophistiquée ; c'est pourquoi je suis passé au :nom comparaison pour illustrer le concept.
C'est aussi un peu trop technique, mais j'espère que l'idée devient claire 

Voir plus...
Re : Comment utiliser la formule Col Maximum avec une condition "où"Je viens de remarquer:
- l'astuce ne marche pas pour
:name=="Robert"
semble être un cas particulier - la comparaison est simplement ignorée (dans Jmp 16 & 17.1).
étrange ...
- Avec tout l'enthousiasme suscité par les nouvelles possibilités (utiliser des conditions (!) comme GroupBy) et par l'amélioration de la vitesse, j'ai complètement raté le fait que je revenais plus ou moins à mon point de départ : l'agrégation de cols avec les options Group By.
Donc, je n'ai pas atteint mon objectif réel : remplir "les autres" lignes avec des valeurs, comme expliqué ici :
Comment-utiliser-la-formule-Col-Maximum-avec-un-quot-où-quot/mp/571889/highlight/true#M78145
Mais il existe une solution de contournement : au lieu d'un lent
New Column( "newcol", Formula(Col Mean( if(:sex=="M",:weight,.), :age ) ));
veillez à ce qu'il n'y ait que des options Group By à l'intérieur de slow Col Mean
... puis utilisez le Col médian rapide pour répartir les valeurs sur les autres lignes :
New Column( "newcol", Formula(Col Median(If(:sex =="M" ,Col Mean( :weight, :age, :sex),.),:age) ));
De plus : le sujet a retenu l'attention de l'équipe de développement Jmp :
Col Median (et autres) : ajout de l'option "Où"
@SamGardner écrit:
Statut changé en : Nous l'aimons! (dans la file d'attente)... nous cherchons à améliorer l'utilisation des clauses Where( ) dans JMP.
Il semble que bientôt il y aura une solution beaucoup plus simple au problème 
Re : Comment utiliser la formule Col Maximum avec une condition « où »Fait amusant :
rechercher « M » dans une liste de chaînes est beaucoup plus rapide que comparer « M » avec une chaîne :

Names Default To Here( 1 );
If( Is Empty( mydt ),
mydt = Open( "$SAMPLE_DATA/Big Class.jmp" )
);
tryAgain = Function( {},
write ("\!nrows: ", nrows(mydt),"\!n");
t0 = HP Time();
mydt << New Column( "char=char", Formula( Col Mean( If( :sex == "M", :weight, . ), :age ) ) );
t=(HP Time()- t0)/1000000;
write("char=char: ",t,"\!n");
t0 = HP Time();
mydt << New Column( "contains", Formula( Col Mean( If( contains(Eval List({:sex[]}) ,"M"), :weight, . ), :age ) ) );
t=(HP Time()- t0)/1000000;
write("contains: ",t,"\!n");
If(
ex = New Window( "",
<<TYPE></TYPE><BR />why?!?<BR />Which secret is behind this finding?
Re : Comment utiliser la formule Col Maximum avec une condition « where » ?2025 - JMP19 offre une amélioration significative de la vitesse pour les comparaisons de chaînes.
cool!
Par ailleurs, la suggestion
col Mean(:weight, :age, where(not(excluded())))
Cette fonction a été introduite pour transformer les colonnes dans les rapports. Elle est devenue aussi compacte que :

En revanche, il reste très difficile de trouver la formule adéquate pour une agrégation restreinte à par exemple :sex="M" :
<SPAN class="token function">if<SPAN class="token punctuation">(</SPAN><SPAN class="token punctuation">:</SPAN>sex<SPAN class="token operator">==</SPAN><SPAN class="token string">"M"& not(excluded()),<BR /></SPAN> col Max</SPAN><SPAN class="token punctuation">(</SPAN><SPAN> </SPAN><SPAN class="token function">if</SPAN><SPAN class="token punctuation">(</SPAN><SPAN class="token punctuation">:</SPAN>sex<SPAN class="token operator">==</SPAN><SPAN class="token string">"M"</SPAN><SPAN class="token punctuation">,</SPAN><SPAN> </SPAN><SPAN class="token punctuation">:</SPAN>weight<SPAN class="token punctuation">,</SPAN><SPAN class="token punctuation">.</SPAN><SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">,</SPAN><SPAN> </SPAN><SPAN class="token punctuation">:</SPAN>age, excluded()<SPAN class="token punctuation">)<BR /> , .<BR />);</SPAN>
Quelque chose comme
col Max(:weight, :age, @excluded, where(:sex=="M"))
cela pourrait beaucoup aider.
Hm : Col Median (et autres) : ajoutez l'option « Où » : 1 Kudo en 3,5 ans ?! Étrange.