Wie verwende ich die Col-Maximum-Formel mit einer „Where“-Bedingung?Hallo, ich habe ein Problem wo ich eine neue Spalte als Benchmark zu allen anderen Ländern formulieren möchte. Wenn es mehr Zeilen für das Land gibt, möchte ich den maximalen Wert davon als Benchmark nehmen. Siehe das Beispiel unten zur Verdeutlichung.
Daten sehen in etwa so aus:
Land Wertzeitraum
A 10 201301
A 30 201301
B20 201301
C50 201301
D 40 201301
Was ich erreichen möchte (mit Zellformel): Col Maximum (:value, :period, :country) wo :land == "A"
Ausgabe:
Land Wertzeitraum Benchmark
A 10 201301 30
A 30 201301 30
B 20 201301 30
C50 201301 30
D 40 201301 30
Wie Sie sehen können, möchte ich nur den Maximalwert von Land A vergleichen.
Ich habe Col Maximum (:value, :period, :country == "A") ausprobiert und es wird "50" zurückgegeben.
Col Maximum (:value, :period, :country) und Col Maximum (:value, :period, :country == "A") geben beide "50" zurück
Ich bin mir ziemlich sicher, dass es dafür eine einfache Lösung gibt!
Hoffe ihr könnt helfen!
Danke Danke!
Re: Wie verwende ich die Col-Maximum-Formel mit einer "Where"-Bedingung?Danke.Re: Wie verwende ich die Col-Maximum-Formel mit einer "Where"-Bedingung?Col Maximum() ist nur in einer Formel sinnvoll, wo ein separates Ergebnis pro Zeile ausgegeben wird.Um das zu tun, was Sie wollen, verwenden Sie die Summarize()-Funktion.
Sehen:
Hilfe==>Scripting-Index==>Zusammenfassen
Re: Wie verwende ich die Col-Maximum-Formel mit einer "Where"-Bedingung?Hallo Mark,
versucht, das maximale Gewicht nach Alter oder Geschlecht zu ermitteln, erzeugt aber im folgenden Skript nur einen Wert.
nach Alter, es gab 6 verschiedene Altersgruppen, für jede möchte ich das maximale Gewicht für jedes Alter berechnen.
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: Wie verwende ich die Col-Maximum-Formel mit einer "Where"-Bedingung?Ich könnte diese Formel zu einer neuen Spalte in der Beispieldatentabelle Big Class hinzufügen:
Col Max( :weight, :age )
Re: Wie verwende ich die Col-Maximum-Formel mit einer "Where"-Bedingung?Hallo Mark,
Können Sie ein Beispiel für die Verwendung von geben, wenn Sie col Max verwenden?
Danke.Re: Wie verwende ich die Col-Maximum-Formel mit einer "Where"-Bedingung?Siehe Hilfe > Skripting-Index > Funktionen:

Re: Wie verwende ich die Col-Maximum-Formel mit einer "Where"-Bedingung?Danke Jim, ich meinte nur zusammenfassen. Wie ich es mache (zwei jsl-Befehle):
Fassen Sie in der Spalte zusammen, erstellen Sie eine neue Tabelle mit Werten (min/max/oder eine andere Statistik für die Spalte).
Dann aktualisiere ich die Haupttabelle mithilfe der zusammengefassten Tabelle, indem ich die Zeileneinträge abgleiche.
Ich war nur neugierig, ob es im Befehl Max col () eine bedingte Option gibt, die eindeutige Spaltenwerte identifizieren und diesen zusätzlichen Schritt überflüssig machen kann. (würde einen zusätzlichen Tisch und 2 zusätzliche Schritte beseitigen).
Schätze deine Hilfe.
Re: Wie verwende ich die Col-Maximum-Formel mit einer "Where"-Bedingung?Normalerweise verwende ich die Summarize()-Funktion anstelle der Summary Platform, um einfach zu bestimmen, welche Ebenen in einer Spalte gefunden werden.Von dort aus müssen Sie nur noch die Formeln generieren, die Sie benötigen, um die Arbeit zu erledigen.
Re: Wie verwende ich die Col-Maximum-Formel mit einer "Where"-Bedingung?Angenommen, die Länderspalte hat mehrere Namen und ich kenne nicht alle möglichen Werte. Wie kann diese Abfrage dahingehend angepasst werden.
Ich kann das tun, indem ich eine Übersichtstabelle erstelle und die Tabelle dann zurückaktualisiere, aber das scheint eine ineffiziente Methode zu sein, ich war neugierig, ob es in einem einzigen Schritt wie diesem gemacht werden könnte.
Danke im Voraus.
Re: Wie verwende ich die Col-Maximum-Formel mit einer "Where"-Bedingung?Entschuldigung für die späte Antwort! Danke für die Lösung!Re: Wie verwende ich die Col-Maximum-Formel mit einer "Where"-Bedingung?In Anbetracht der Art und Weise, wie Sie Ihre Bedürfnisse angegeben haben, vorausgesetzt, Sie wissen, in welchem Land die mehreren Einträge vorhanden sind.
dt = Current Data Table();
rowperiod = :Period[Row()];
Max(
:Value[dt << get rows where(
:Country == "A" & :period == rowperiod
)]
);
Re: Wie verwende ich die Col-Maximum-Formel mit einer "Where"-Bedingung?
@Hogi schrieb:Gibt es eine einzeiliger Befehl weiblich aus der Mittelwertbildung zu entfernen, aber die Werte in die entsprechenden Zeilen mit „weiblich“ zu schreiben?
Ich meine so etwas wie:
Col Mean( :weight, :age, where( :sex == "M" ) )
?
Re: Wie verwende ich die Col-Maximum-Formel mit einer "Where"-Bedingung?Wenden Sie ein If() auf die Spalte :weight in der Gleichung an

col Mean( if(:sex=="M", :weight,.), :age)
Re: Wie verwende ich die Col-Maximum-Formel mit einer "Where"-Bedingung?Fantastisch!
Und so logisch - wenn man es sieht!
Ich bin sehr enttäuscht von mir selbst, dass ich diese Lösung nicht alleine gefunden habe.
Betreff: Wie verwende ich die Col Maximum-Formel mit einer „Wo“-Bedingung?Hm, nach einiger Begeisterung bin ich etwas geerdet.
Scheint, dass das if innerhalb der Col-Aggregation es sehr langsam macht – insbesondere, wenn es innerhalb des if einen Zeichenvergleich gibt – und insbesondere x 2, wenn es eine char(num)-Konvertierung gibt. Dann skaliert die Zeit ~ quadratisch mit zunehmender Tabellengröße.
Das Gute: Col Median (den ich die meiste Zeit benutze) ist von diesem "Bug" nicht betroffen:)
Gibt es eine einfache Lösung für Col Min, Max, Mittelwert …?
Wenn nicht, werde ich einen Wunsch zur Implementierung einer offiziellen Methode zur Berechnung von Spalte xyz mit einer Where -Bedingung schreiben …
Wesentlich schneller ginge es, wenn man den Datensatz erst reduziert ( wo ) und dann aggregiert ( Spalte xyz ) und die Werte anschließend auf alle entsprechenden Zeilen verteilt.

Mehr anzeigen...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">Namen werden standardmäßig hier verwendet (1); Wenn (leer ist (mydt), mydt = Öffnen ("$SAMPLE_DATA/Big Class.jmp")); trialRun = 0; tryAgain = Funktion ( {}, trialRun += 1; Zeilennummern = N Zeilen ( mydt ); t1 = HP-Zeit(); mydt << Neue Spalte ( "Spalte A", Formel (Spaltenmittelwert ( :Gewicht ), :Geschlecht ) ); t2 = HP-Zeit(); mydt << Neue Spalte ( "Spalte B", Formel (Spaltenmittelwert ( Wenn ( :Alter == 12, :Gewicht, . ), :Geschlecht ) ) ); t3 = HP-Zeit(); mydt << Neue Spalte ( "Spalte C", Formel (Spaltenmittelwert ( Wenn ( :Geschlecht == "M", :Gewicht, . ), :Alter ) ) ); t4 = HP-Zeit(); mydt << Neue Spalte ( "Spalte D", Formel (Spaltenmittelwert ( Wenn ( Zeichen ( :Alter ) == "12", :Gewicht, . ), :Alter ) ) ); t5 = HP-Zeit(); mydt << Neue Spalte ("Spalte E", Formel ("Zeichen (: Alter) == "12")); t6 = HP Zeit (); tt1 = Runde ((t2 - t1) / 1000000, 4); tt2 = Runde ((t3 - t2) / 1000000, 4); tt3 = Runde ((t4 - t3) / 1000000, 4); tt4 = Runde ((t5 - t4) / 1000000, 4); tt5 = Runde ((t6 - t5) / 1000000, 6); Wenn (Testlauf == 1, tt1Ref = tt1; tt2Ref = tt2; tt3Ref = tt3; tt4Ref = tt4; tt5Ref = tt5; RNref = Zeilennummern; ); tr1 = Runde( tt1 / tt1Ref ); tr2 = Runde( tt2 / tt2Ref ); tr3 = Runde( tt3 / tt3Ref ); tr4 = Runde( tt4 / tt4Ref ); tr5 = Runde( tt5 / tt5Ref ); RNratio = Runde( Zeilennummern / RNref ); Warten( 0,1 ); Versuchen( mydt << Spalten löschen( "Spalte A", "Spalte B", "Spalte C", "Spalte D", "Spalte E" ) ); Warten( 0,1 ); mydt = mydt << Verketten( mydt, mydt, mydt ); Warten( 0,1 ); Wenn( ex = Neues Fenster( "Ergebnisse", < <TYPE></TYPE></DIV></DIV>
In a previous version I had "ms" in the table instead of seconds. Unfortunately, it's 1000x more severe ...
Betreff: Wie verwende ich die Col-Maximum-Formel mit einer „Wo“-Bedingung?Interessante Frage – warten Sie noch auf eine Antwort?
Es gibt eine Reihe von Beiträgen mit ähnlichen Fragen zur Einschränkung Col ... Aggregation Funktionen einer bestimmten Teilmenge zuordnen.
(hauptsächlich: Beschränken Sie sie auf die Teilmenge der nicht ausgeschlossenen Zeilen)
Berechnen Sie den Spaltenmittelwert und beschränken Sie dabei die verwendeten Beobachtungen
JMP10: Die Funktionen Col Max() und Col Min() gaben die Daten aus der ausgeschlossenen Zeile zurück
Spaltenfunktionen und Zeilenzustände
Die Idee:
Wenn man sich für die mittlere Höhe interessiert, kann man über alle Zeilen aggregieren – oder man kann männliche und weibliche Einträge getrennt aggregieren.
Für die zweite Lösung ist die Lösung fast genauso einfach wie für die erste: Verwenden Sie einfach eine zusätzliche GroupBy-Variable, um zwischen gewünschten und unerwünschten Daten aufzuteilen.
Aber was ein Benutzer oft zusätzlich braucht: Die Werte sollten in allen entsprechenden Zeilen angezeigt werden (also auch für Frauen).
[Das Beispiel mit der Benchmark-Spalte im Originalbeitrag verdeutlicht, warum ein solches Verhalten sinnvoll sein könnte.]
Mit GroupBy ist es einfach, die richtigen Werte zu erhalten – aber wie verteilt man sie über ALLE Zeilen?
Wenn sich hinter a so etwas wie eine Nachschlagetabelle befindet Col ... Aggregation Funktion verwendet die Funktion denselben Bezeichner
1) um Zeilen zur Aggregation in verschiedene Gruppen aufzuteilen („M“ / „F“):
Judy ist weiblich, das Gewicht in Judys Reihe sollte berücksichtigt werden weibliches Durchschnittsgewicht
2) als Index beim Lesen eines Eintrags aus der Lookup-Tabelle („M“ / „F“):
Judy ist weiblich, soll die neue Kolumne enthalten weibliches Durchschnittsgewicht in Judys Reihe
Entweder erhalten Mann und Frau die gleichen Werte, weil der Identifikator derselbe ist (Mittelwert1) – oder sie erhalten unterschiedliche Werte, weil der Identifikator unterschiedlich ist (Mittelwert2).
Ergo:
Ein Jmp-Benutzer dürfen Verwenden Sie die GroupBy-Funktion, um Werte aus der Berechnung zu entfernen:
- Berechnung unterschiedliche Werte für verschiedene Untergruppen
- Löschen Sie die unerwünschten Ergebnisse
aber dann bekommt er es
- erhalten unterschiedliche Werte für verschiedene Untergruppen
kostenlos - auch wenn er diese Option nicht bestellt hat (OK, der Code erzählt eine andere Geschichte - aber denken wir mal darüber nach, was der Benutzer wollte) 
Gibt es ein einzeiliger Befehl um weiblich aus der Mittelwertberechnung zu entfernen, die Werte aber mit „weiblich“ in die entsprechenden Zeilen zu schreiben?
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 )
);
Betreff: Wie verwende ich die Col-Maximum-Formel mit einer „Wo“-Bedingung?Ein Ansatz, um die Dinge zu beschleunigen Größenordnungen (!!!):
Anstelle des sehr langsamen Col Mean mit dem Zeichenvergleich innerhalb der if-Anweisung :
mydt << New Column( "col C", Formula( Col Mean( If( :name=="Robert", :weight, . ), :age ) ) );
verwenden @cwillden Der Trick: Verwenden Sie den Vergleich als GroupBy-Argument:
Gelöst: Betreff: Zeilen abrufen, die eine Bedingung innerhalb einer Spaltenformel erfüllen – JMP-Benutzer-Community
mydt << New Column( "col C", Formula(if(:name=="Robert" , Col Mean( :weight, :age, :name=="Robert" ),. ) );
um die Daten in zwei Gruppen aufzuteilen: gewünschte und unerwünschte Daten (Screenshot unten mit @10.000 Zeilen -> Faktor 2000 schneller 
.. und dann die unerwünschten Ergebnisse über die if-Anweisung außerhalb der Col Mean-Aggregation entfernen.
Mit dem Vergleich für die Spalte :Sex dieser Ansatz wäre überkonstruiert; Aus diesem Grund bin ich auf die umgestiegen :Name Vergleich zur Veranschaulichung des Konzepts.
Das ist auch etwas überkonstruiert, aber ich hoffe, dass die Idee klar wird 

Mehr sehen...
Betreff: Wie verwende ich die Col-Maximum-Formel mit einer „Wo“-Bedingung?I hab gerade gemerkt:
- Der Trick funktioniert nicht
:name=="Robert"
scheint ein Sonderfall zu sein – der Vergleich wird einfach ignoriert (in Jmp 16 und 17.1).
seltsam ...
- Bei all der Begeisterung über die neuen Möglichkeiten (Verwendung von Bedingungen (!) als GroupBy) und über die Geschwindigkeitsverbesserung habe ich völlig übersehen, dass ich mehr oder weniger wieder dort angekommen bin, wo ich angefangen habe: Col-Aggregation mit Group By-Optionen.
Mein eigentliches Ziel, „die anderen“ Zeilen mit Werten zu füllen, habe ich also nicht erreicht, wie hier erklärt:
Wie-verwende-ich-die-Col-Maximum-Formel-mit-einem-quot-where-quot/mp/571889/highlight/true#M78145
Aber es gibt einen Workaround: statt eines langsamen
New Column( "newcol", Formula(Col Mean( if(:sex=="M",:weight,.), :age ) ));
Achten Sie darauf, dass im langsamen Col Mean nur Group By-Optionen vorhanden sind
... dann verwenden Sie den schnellen Col Median, um die Werte auf die anderen Zeilen zu verteilen:
New Column( "newcol", Formula(Col Median(If(:sex =="M" ,Col Mean( :weight, :age, :sex),.),:age) ));
Außerdem hat das Thema einige Aufmerksamkeit vom Jmp-Entwicklungsteam erhalten:
Col Median (und andere): Option „Wo“ hinzufügen
@SamGardner schrieb:
Status geändert in: Wir mögen es! (in der Warteschlange)... wir arbeiten an Möglichkeiten, die Verwendung von Where( )-Klauseln in JMP zu verbessern.
Scheint, dass es bald eine viel einfachere Lösung für das Problem geben wird 
Betreff: Wie verwende ich die Col Maximum-Formel mit einer „Wo“-Bedingung?Lustige Tatsache:
Die Suche nach „M“ in einer Liste von Zeichenfolgen ist um Größenordnungen schneller als der Vergleich von „M“ mit einer Zeichenfolge:

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?
Betreff: Wie verwende ich die Spaltenmaximumformel mit einer "where"-Bedingung?2025 - JMP19 bietet eine deutliche Geschwindigkeitsverbesserung für Stringvergleiche.
Cool!
Darüber hinaus wurde Folgendes vorgeschlagen
col Mean(:weight, :age, where(not(excluded())))
wurde für die Transformation von Spalten in Berichten eingeführt. Es ist so kompakt wie folgt:

Andererseits ist es immer noch sehr schwierig, die richtige Formel für eine Aggregation zu finden, die beispielsweise auf :sex="M" beschränkt ist.
<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>
So etwas wie
col Max(:weight, :age, @excluded, where(:sex=="M"))
könnte sehr helfen.
Hm: Col Median (und andere): Option "Wo" hinzufügen : 1 Kudo in 3,5 Jahren?! Seltsam.