Zähle die Anzahl der eindeutigen Elemente in einer Spalte, die bestimmte Kriterien erfüllen.Angenommen, ich möchte in der Klasse „Große Klasse“ eine Formel, die die Anzahl der eindeutigen Namen von Personen zählt, die gleich groß oder kleiner als die Person in der aktuellen Zeile sind. Wie kann ich das umsetzen?
Ich habe Folgendes:
thisHeight = :height;
Col N Unique( :name, :height <= thisHeight );
Mir ist bewusst, dass der zweite Parameter der Gruppierungsparameter ist, und es ist intuitiver zu versuchen, die Werte, die an den ersten Parameter übergeben werden, einzuschränken, aber bisher hatte ich mit keinem meiner Versuche Erfolg.
DatenzugriffBetreff: Anzahl der eindeutigen Elemente in einer Spalte zählen, die bestimmte Kriterien erfüllenDie nächstliegende integrierte Funktion, die mir einfällt, ist Col Rank( :height, < Das Problem ist: Hierbei wird die Gesamtzahl der Zeilen mit einer Höhe von thisHeight oder darunter gezählt, nicht die Anzahl der eindeutigen Namen .
Alternativ könnten Sie eine benutzerdefinierte Formel ausprobieren, zum Beispiel diese:
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 )
Betreff: Anzahl der eindeutigen Elemente in einer Spalte zählen, die bestimmte Kriterien erfüllenIch bin mir nicht sicher, ob das mit Col-Funktionen möglich ist, da sich die neuen Funktionen etwas anders verhalten als die alten.
As Constant(n = :name << get values);
curheight = :height;
r = Where(:height <= curheight);
N Items(Set Unique(n[r]));
Betreff: Anzahl der eindeutigen Elemente in einer Spalte zählen, die bestimmte Kriterien erfüllenIch habe gestern Abend etwas sehr Ähnliches ausprobiert, und JMP ist dabei eingefroren. Ich habe es die ganze Nacht laufen lassen, und als ich heute Morgen zur Arbeit kam, war das JMP-Datentabellenfenster leer und reagierte nicht mehr. Der Task-Manager zeigte an, dass der Rechner nur einen Kern nutzte und über 40 GB RAM frei waren (es lag also weder am Arbeitsspeicher noch an der CPU-Auslastung). Meine Tabelle hat fast 400.000 Zeilen, daher vermute ich, dass es sich um eine Lösung mit einer Komplexität von etwa O(N²) handelt.
Betreff: Anzahl der eindeutigen Elemente in einer Spalte zählen, die bestimmte Kriterien erfüllen@jthi Bezüglich meines obigen Kommentars: Auch dies sieht nach einer O(N^2)-Lösung aus. (Es ist wirklich ärgerlich, dass eine fehlerhafte Formel die gesamte Sitzung blockieren/zum Absturz bringen kann; ich habe gestern einen Großteil meiner Nachmittagsarbeit verloren, weil ich einen ähnlichen Lösungsversuch unternommen habe.)
Schade, dass die neuen Spaltenfunktionen nicht wie gewohnt funktionieren. Meine Frage war vielleicht etwas zu simpel. Ich benötige auch die Gruppierungsspalten und bin mir nicht sicher, wie ich sie in dieser Lösung implementieren soll. Wahrscheinlich muss ich das in Python umsetzen, was ärgerlich ist, da die Spalte nicht automatisch aktualisiert wird und Python-Skripte noch nicht in der Tabelle gespeichert werden können.
PS: Da ich bei jeder Interaktion etwas von Ihnen lernen möchte
– warum benötigt dieser Ansatz die Funktion „As Constant()“? Was würde ohne sie passieren?
Betreff: Anzahl der eindeutigen Elemente in einer Spalte zählen, die bestimmte Kriterien erfüllenFalls Sie eine Formel benötigen, bin ich mir nicht sicher, wie gut Python dafür geeignet ist. Die Funktion `Constant()` dient ja dazu, zu verhindern, dass die Namensliste in jeder Zeile immer wieder neu berechnet wird.
Betreff: Anzahl der eindeutigen Elemente in einer Spalte zählen, die bestimmte Kriterien erfüllenDie Python-Lösung funktionierte und war, alles in allem, recht schnell zu implementieren/auszuführen.
Ich hoffe immer noch, dass Col N Unique() für eine zukünftige Version überarbeitet wird, damit es den anderen ähnlich ist.
Ich wünschte mir, es gäbe irgendwo ein „JMP-Formel-Kochbuch“, das wir nutzen oder durchsuchen könnten. Ich programmiere seit 33 Jahren aktiv in VBA, AppleScript, Perl, Python und JavaScript (und ein bisschen C++), und JSL ist mit Abstand die schwierigste Sprache, die ich lernen und verstehen kann. Ich verstehe immer noch nicht, warum `As Constant()` notwendig ist oder was es überhaupt bewirkt. Ich habe den Großteil des Scripting Guide gelesen, aber es scheint, als bräuchte es noch ein weiteres Buch.
Betreff: Anzahl der eindeutigen Elemente in einer Spalte zählen, die bestimmte Kriterien erfüllenSie möchten keine Werte auswerten, die sich in jeder Zeile der Formelausführung nicht ändern. Genau das bewirkt die Funktion „As Constant()“: Sie veranlasst JMP, den Ausdruck nur einmal, in der ersten Zeile, auszuwerten.
Als Konstante(Ausdruck)

Ich denke, man könnte es im Grunde ersetzen durch (höchstwahrscheinlich nicht genau dasselbe, aber ziemlich ähnlich).
If(Row() == 1,
n = :name << get values;
);
Betreff: Anzahl der eindeutigen Elemente in einer Spalte zählen, die bestimmte Kriterien erfüllenUm nicht in eine Sackgasse zu geraten, noch eine Frage –
Werden Spaltenformeln effektiv einmal ausgewertet, wobei jeder Ausdruck jedoch im Kontext eines Arrays ausgewertet wird?
Oder wird die gesamte Formel einmal pro Zeile neu ausgeführt, wobei Row() festlegt, welche Zeile gerade ausgewertet wird?
Oder verstehe ich etwas Grundlegenderes falsch? Mein Verständnis davon, wie JMP mit Formeln umgeht, ist in unvereinbare Teile zersplittert…
Betreff: Anzahl der eindeutigen Elemente in einer Spalte zählen, die bestimmte Kriterien erfüllenJemand, der sich mit den Interna von JMP auskennt, kann sicher eine bessere Antwort geben als ich vermute (vielleicht @Craige_Hales ?). Ich betrachte sie als Ausdrücke (es sind einfach JSL-Code), die bei Bedarf für jede Zeile direkt in der Datentabelle ausgewertet werden. Wann dies nötig ist, bestimmt JMP, sofern ich die Auswertung nicht unterdrücke. Es gibt Optimierungen wie Spaltenfunktionen, die (meistens) nur einmal ausgewertet werden.
Die JMP-Hilfe enthält einige nützliche Links, aber ich kann auf die Schnelle nur diesen einen finden:
Betreff: Anzahl der eindeutigen Elemente in einer Spalte zählen, die bestimmte Kriterien erfüllenHier ist eine Technik, um tiefer in die Materie einzutauchen:
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
*/

Das Semikolon (;) ist ein JSL-Operator, der eine Reihe von Anweisungen ausführt und den Wert der letzten Anweisung zurückgibt. Das bedeutet, dass einer Berechnung eine print-, show- oder write-Anweisung vorangestellt werden kann, um einen Eintrag im Protokoll zu erzeugen.
Wie ich oben gelernt habe, wird asconstant(...) vor der Berechnung der ersten Zeile herausgezogen, wobei Zeile 1 die aktuelle Zeile ist.
JMP sortiert außerdem die Spalten, um herauszufinden, welche zuerst ausgewertet werden können.
Betreff: Anzahl der eindeutigen Elemente in einer Spalte zählen, die bestimmte Kriterien erfüllenSpalte E ergäbe so mehr Sinn:
New Column( "e",
formula(
Write( "\!nE" || Char( Row() ) );
As Constant( Write( "\!nE as constant " || Char( Row() ) ); a + b + c + d; );
)
)
Die Variable Q ist überflüssig und verschleiert den eigentlichen Zweck von AsColumn.
Betreff: Anzahl der eindeutigen Elemente in einer Spalte zählen, die bestimmte Kriterien erfüllenHier ist noch ein Link, der manchmal hilfreich sein kann (versuchen Sie nicht, alles in eine einzige Formel zu pressen): JMP verwenden > Formeln in JMP erstellen > Formeln in JMP erstellen

Ein weiterer Vorteil ist, dass es bei mehreren Formeln viel einfacher ist, die Ergebnisse zu überprüfen und in manchen Fällen die Formeln zu debuggen.