So ermitteln Sie die Mindest- und Höchstwerte in DatengruppenAngenommen, ich nehme alle Schüler der großen Klasse und teile sie nach Geschlecht und Alter in Gruppen ein, z. B. 12-jährige Jungen in eine Gruppe, 12-jährige Mädchen in eine andere usw.
Mit diesem Setup möchte ich eine Formelspalte erstellen, die eine 1 enthält, wenn diese Gruppe für ihr Alter bei beiden Geschlechtern die geringste Maximalgröße hat, und andernfalls eine 0.
In diesen Daten beispielsweise:
| Gruppe | Name | Höhe | NEUE KOLUMNE |
| 12-jährige Mädchen | KATIE | 59 | 0 |
| | JANE | 55 | 0 |
| | JACLYN | 66 | 0 |
| | LILLIE | 52 | 0 |
| 12-jährige Jungen | TIM | 60 | 1 |
| | JAMES | 61 | 1 |
| | ROBERT | 51 | 1 |
Die Maximalgröße beträgt für Mädchen 66 und für Jungen 61. Die Jungengruppe hat also die geringste Maximalgröße für ihr Alter. Die neue Formelspalte enthält also eine 1 für Tim, James und Robert und eine 0 für Katie, Louise, Jane usw.
Ist dies in einer Formelspalte möglich?
(Ich kann mitteilen, was ich versucht habe, aber ich versuche, das xy-Problem zu vermeiden, http://xyproblem.info hier ...)
Grundlegende Datenanalyse und ModellierungDatenexploration und -visualisierungBetreff: So ermitteln Sie die Mindest- und Höchstwerte in DatengruppenSie können die Col...-Aggregationen verwenden.
edit: wenn jemand nach dem Geschlecht des kleinsten Schülers pro Altersgruppe gefragt hat:
Verwenden Sie zunächst „Col Min“, um den Schüler mit der geringsten Körpergröße pro Alter zu finden.
Verwenden Sie dann Col Max, um dieses Wissen unter allen Schülern des gleichen Geschlechts zu verbreiten.
Also:
New Column( "myCol",
Formula( Col Maximum( :height == Col Minimum( :height, :age ), :sex, :age ) ),
)
Wie Sie gefragt haben
eine Formelspalte, die eine 1 enthält , wenn diese Gruppe die geringste Maximalgröße für ihr Alter bei beiden Geschlechtern hat, und andernfalls eine 0
Der Ansatz muss korrigiert werden, um
New Column( "myCol",
Formula(
Col Maximum(
:height == Col Min( Col Maximum( :height, :age, :sex ), :age ),
:sex,
:age
)
)
)
entlang der Idee von:
- was ist die maximale Körpergröße pro Alter und Geschlecht
- Nehmen Sie die Werte und ermitteln Sie die minimale (maximale) Körpergröße pro Alter
- which student?
[ah, nein, wir wollen keinen zufälligen Schüler, wir wollen nur einen Schüler mit der maximalen Größe!]
-> 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>Das andere Geschlecht setzt du auf 0 - bzw. 1, wenn es sich um einen Jungen und ein Mädchen mit gleicher Körpergröße handelt.</STRIKE><BR /><FONT face="comic sans ms,sans-serif" color="#999999">diesen Teil brauchen wir nicht mehr</FONT><BR /><FONT face="comic sans ms,sans-serif" color="#999999">... und wir landeten genau bei Jarmos Lösung (siehe unten)</FONT><BR /><BR /></LI></UL></LINGO-BODY><LINGO-SUB id="lingo-sub-821774" slang="en-US" mode="CREATE">Betreff: So ermitteln Sie die Mindest- und Höchstwerte in Datengruppen</LINGO-SUB><LINGO-BODY id="lingo-body-821774" slang="en-US" mode="CREATE"><P>XY-Problem:<BR /> Danke : )</P></LINGO-BODY><LINGO-SUB id="lingo-sub-821776" slang="en-US" mode="CREATE">Betreff: So ermitteln Sie die Mindest- und Höchstwerte in Datengruppen</LINGO-SUB><LINGO-BODY id="lingo-body-821776" slang="en-US" mode="CREATE"><P>Wow, das scheint zu funktionieren, aber mein Gehirn kann nicht einmal begreifen, wie das funktioniert ...</P><P> </P><P>Lassen Sie mich versuchen, es hier näher zu erläutern. Vielleicht können Sie mir helfen, es zu verstehen –</P><P> </P><P>Beginnend mit: Col Maximum( :height == Col Minimum( :height, :age ), :sex, :age )</P><P> </P><P>Col Minimum( :Größe, :Alter ) --> gibt die Mindestgröße aller Schüler dieses Alters zurück</P><P> </P><P>:height == Col Minimum( :height, :age ) --> gibt true/false (1/0) zurück, wenn die Spalte „height“ dieser Zeile dieser Mindesthöhe entspricht</P><P> </P><P>Col Maximum( <1 oder 0 für diese Zeile> , :Geschlecht, :Alter ) --> äh... das ergibt keinen Sinn, ich dachte, das Spaltenmaximum funktioniert, indem die Daten nach den Gruppierungsspalten (:Geschlecht, :Alter) gruppiert werden und dann das Spaltenmaximum der Werte oder Spalten im ersten Argument gefunden wird – was jetzt nur noch ein einzelnes Wahr/Falsch oder 1/0 ist – und dann der entsprechende Maximalwert für die Gruppe dieser Zeile zurückgegeben wird, also die Werte dieser Zeile für :Geschlecht und :Alter.</P><P> </P><P>Das ist offensichtlich falsch. Was übersehe ich hier?</P><P> </P><P> </P><P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-821779" slang="en-US" mode="CREATE">Betreff: So ermitteln Sie die Mindest- und Höchstwerte in Datengruppen</LINGO-SUB><LINGO-BODY id="lingo-body-821779" slang="en-US" mode="CREATE"><P>Es gibt viele Möglichkeiten, dies zu tun, beispielsweise durch verschiedene Kombinationen statistischer Spaltenfunktionen (wie bereits gezeigt). Hier eine andere Option (ich denke, sie sollte das tun, wonach Sie suchen)</P>
<P> </P>
<PRE><CODE class=" language-jsl">Col Min(Col Max(:height, :age, :sex), :age) == Col Max(:height, :age, :sex)
Zuerst sucht Col Min() nach Col Max() für alle Alters- und Geschlechtsgruppen ÜBER dem Alter und vergleicht dies dann mit den Maximalwerten für Alters- und Geschlechtsgruppen. Wenn dieser Wert dem Minimalwert für die Altersgruppen entspricht, lautet der Wert 1.
Um diese leichter zu verstehen, halte ich es für sinnvoll, sie alle einzeln aufzuschreiben und so leichter verständlich zu machen. In diesem Fall:
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
Betreff: So ermitteln Sie die Mindest- und Höchstwerte in DatengruppenDanke @jthi – ich bin jedoch immer noch verwirrt.
Beginnen wir damit:
Col Min(Col Max(:height, :age, :sex), :age) == Col Max(:height, :age, :sex)
Was wird zurückgegeben, wenn JMP „Col Max(:Größe, :Alter, :Geschlecht)“ auswertet? Einen einzelnen Wert oder eine Liste?
Ich kann mit dieser Formel eine neue Spalte erstellen und sie erzeugt eine Liste von Werten, die in den Zeilen der Spalte landen.
Aber innerhalb einer Formel scheint es einen einzelnen Wert zurückzugeben, zB:
a = col max(:height, :name);
type(a);
... gibt „Zahl“ zurück.
Und wenn ich ein neues Skript erstelle und eingebe:
a = col max(:height, :name); <BR />show(a);
es heißt „ungültige Zeilennummer“, aber ohne „, :name“ funktioniert es einwandfrei und gibt 70 zurück. Es scheint, als würde JMP diesen Funktionen eine Art kontextspezifische Bedeutung verleihen. Wie funktioniert das? Wird es irgendwo erklärt?
Betreff: So ermitteln Sie die Mindest- und Höchstwerte in DatengruppenWenn Sie die Formel einer Formelspalte in einer Zelle ausführen, berechnet sie den Wert für die aktuelle Zeile.
Wenn Sie es in JSL ausführen, berechnet es es für die aktuelle Zeile.
Klingt gleich. Aber der Standardwert für „aktuelle Zeile“ ist „Zeile 0“ – also keine gültigen Zahlen.
Sie können die Berechnung auch für jede beliebige Zeile überprüfen – abweichend vom Standardwert „0“.
Setzen Sie einfach row()=xy vor Ihre Berechnung und die Berechnung wird für die Zeile xy durchgeführt.
also zB
row()=5;
col max(:height, :age)
gibt 66 zurück.
:Alter in Zeile=5 ist 12 und die maximale Größe für Alter =12 ist 66 .
Betreff: So ermitteln Sie die Mindest- und Höchstwerte in DatengruppenIch denke, es funktioniert so:
Col ... durchläuft zunächst alle Zeilen und speichert die Ergebnisse des ersten Arguments.
Es berechnet es Zeile für Zeile – zB wenn das erste Argument random uniform() ist.
Darüber hinaus speichert es eine Nachschlagetabelle für die zusätzlichen Gruppierungsargumente.
Anschließend teilt es die Daten in Teilmengen auf, berechnet die aggregierten Werte – und verteilt die aggregierten Werte anschließend wieder auf die jeweiligen Zeilen.
Betreff: So ermitteln Sie die Mindest- und Höchstwerte in Datengruppen
Was wird zurückgegeben, wenn JMP „Col Max(:Größe, :Alter, :Geschlecht)“ auswertet? Einen einzelnen Wert oder eine Liste?
Einzelner Wert.
Wenn Sie ein Skript erstellen und testen möchten, was passiert, müssen Sie Row() verwenden, WENN Sie nach Spalten arbeiten (ohne nach Spalten funktioniert es, da JMP alle Zeilen verwenden kann). Row() ist in JMP standardmäßig 0, Sie müssen es also beispielsweise in Row() = 1 ändern. Ich glaube, ich habe in der JMP-Hilfe oder im Skriptindex eine Dokumentation dazu gesehen, habe aber keine Ahnung, wo (könnte mit den statistischen Funktionen Row(), For Each Row oder Col zusammenhängen).
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);Betreff: So ermitteln Sie die Mindest- und Höchstwerte in DatengruppenEs klingt, als würden Sie sagen, dass JMP die gesamte Spaltenformel in eine Schleife einbindet, die „Row()“ über die Zeilen der Tabelle iteriert und für jede Zeile einen Wert berechnet.
Das *würde* Sinn machen, wenn da nicht dieser Ausdruck wäre:
Col Min(Col Max(:height, :age, :sex), :age)
... was nach dieser Logik, wenn z. B. Row() auf i=1 gesetzt ist, Col Max() als den größten Wert in der Spalte :height der gesamten Tabelle berechnet, wobei :age[i] == :age[1] und :sex[i] == :sex[1], was eine einzelne Zahl ergibt. Dann versucht es, Col Min() dieser einzelnen Zahl zu berechnen, was per Definition immer nur diese Zahl sein kann. Ich habe wirklich Mühe, das verständlich zu machen.
Ich denke immer, dass Col Max() eine Liste zurückgeben muss, dann könnte Col Min() alle Zeilen dieser Liste betrachten, in denen :age[i] == :age[1].
Aber meine Idee hier erfordert, dass JMP etwas Ähnliches tut wie Perl, also im Wesentlichen verfolgt, ob etwas im Skalar- oder Listenkontext aufgerufen wird, d. h. wenn eine Funktion so verwendet wird, dass sie eine Liste zurückerwartet, gibt sie eine Liste zurück, andernfalls gibt sie einen Skalar zurück. Auf diese Weise könnte Col Max() hier eine Liste für Col Min() zurückgeben, was wiederum einen Skalarwert zurückgeben würde.
Ich vermute, dass ich hier etwas übersehe und nicht genau sagen kann, was.
Betreff: So ermitteln Sie die Mindest- und Höchstwerte in DatengruppenNein, die Idee ist NICHT, dass JMP EINMAL Zeile für Zeile durch die Tabelle geht und den gesamten Ausdruck berechnet.
Betreff: So ermitteln Sie die Mindest- und Höchstwerte in DatengruppenUm zu untersuchen, was JMP macht, erstellen wir zunächst eine sehr kleine Datentabelle ...
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());
... und eine Formelspalte mit einigen Protokollfunktionen:
New Column( "test", Formula(Col Min(Write( "\!nmin:" || (Char( Row() )) );if(row()==nr, write("\!n") );:height, :age)));die Ausgabe:

In diesem Fall führt JMP den Code mehrmals aus.
Lass uns später rätseln...
Betreff: So ermitteln Sie die Mindest- und Höchstwerte in DatengruppenSchauen wir uns nun an
New Column( "test",
Formula(
Col Min(
Write( "\!nmin:" || (Char( Row() ) || "\!n\!n") );
Col Max(
Write( "max:" || (Char( Row() ) || "\!n") );
:height;,
:age,
:sex
);,
:age
)
)
)
... und wir bekommen *)

Darin steht:
- für das einfache Beispiel wertet JMP das erste Argument von Col Min für jede Zeile aus
- für die zweite Version wertet JMP das erste Argument von Col Min für jede Zeile aus - und da es in diesem Code eine weitere Col...- Aggregation gibt, folgt darauf die ColMax- Schleife: erstes Argument von Col Max für jede Zeile
Am Ende kennt JMP den Wert von ColMax(...) für jede einzelne Zeile und kann dann Col min mit diesen Werten auswerten.
Das ist mehr oder weniger das, was Sie sagen – mit dem Listenkontext. Aber ich denke, JMP speichert die Ergebnisse im Datentabellenkontext. So dass es die WERTE mit zusätzlichen Informationen wie row(), row states() usw. kombinieren kann.
aber jemand von JMP – oder @jthi – könnte es besser erklären …
*) nochmal: mehrfach:
weitere Details finden Sie hier:
https://community.jmp.com/t5/Discussions/Statistical-functions-Col-Mean-for-example-possably-bugged-on/mp/613887/highlight/true#M81398
Betreff: So ermitteln Sie die Mindest- und Höchstwerte in Datengruppeneine andere Möglichkeit, die Ausführung des Codes zu testen:
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 );

ich = 5 x 4
j = 5 x 5 x 4
Betreff: So ermitteln Sie die Mindest- und Höchstwerte in Datengruppen-
Betreff: So ermitteln Sie die Mindest- und Höchstwerte in DatengruppenCol-Statistikfunktionen verfügen über ihre eigene Magie, die andere Funktionen nicht haben. Sie verfügen beispielsweise über internes Caching und unterstützen Byvars. https://www.jmp.com/support/help/en/18.0/#page/jmp/statistical-functions.shtml#
Betreff: So ermitteln Sie die Mindest- und Höchstwerte in DatengruppenJa, diese clevere Art der Datenaufbereitung ist äußerst hilfreich:
Beispiele, wie die Magie funktioniert:
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
Bitte achten Sie darauf, dass Sie nicht auf einen dieser Abgriffe stoßen:
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
Col-Aggregationen werden vorsichtig, wenn sie sehen
dann schalten sie auf eine reduzierte Geschwindigkeit um und berechnen jeden Wert für jede Zeile (+1) ... in einem hierarchischen Baum.
Betreff: So ermitteln Sie die Mindest- und Höchstwerte in DatengruppenIch bin nicht sicher, ob ich schlau genug bin, um alles zu verstehen, was Sie hier tun –
Es klingt, als würden Sie mir zustimmen? D. h., dass Col ... Funktionen in Skalar- und Listenkontexten unterschiedliche Dinge tun?
Betreff: So ermitteln Sie die Mindest- und Höchstwerte in DatengruppenWarten wir ein Jahr und diskutieren wir noch einmal. Es könnte sich etwas ändern.