Hallo,
Ich habe Daten mit ungefähr 5000 Zeilen.
Es gibt drei Spalten (Gruppe, Punktzahl und Anzahl)
Wert für Gruppe: A, B.
Wert für Punktzahl im Bereich von 0,5 - 1
Der Wert für Count ist 1 für jede Zeile.

Ich möchte die Daten nach Gruppe A und B zusammenfassen und den Score-Wert in wenigen Kategorien gruppieren und dann die Anzahl für jede Score-Kategorie wie folgt formatieren.

Ich suche Hilfe von der Community, wie man ein JSL-Skript erstellt, um diese Aufgabe auszuführen.
Auch hier füge ich Daten hinzu.
Vielen Dank
Ich würde einen interaktiven Ansatz verwenden, um ein Skript dafür zu erfassen. Beginnen wir zunächst mit der Datentabelle:

Ich habe Count off verlassen, weil wir es nicht brauchen, aber es wird nicht weh tun, wenn es da ist.
Ich habe die Spalte Score ausgewählt und dann zu Cols, Utilities, Make Binning Formula navigiert:

Stellen Sie den Versatz auf 0,5 und die Behälterbreite auf 0,1 ein:

Klicken Sie mit der rechten Maustaste auf die neue Spalte (Score Binned) und kopieren Sie die Spalteneigenschaften:

Öffnen Sie dann ein neues Skriptfenster und fügen Sie (Strg-V) ein, was zu dieser JSL führt:
Add Column Properties(
Value Labels(
{-0.5 = "-0.5 — -0.4", -0.4 = "-0.4 — -0.3", -0.3 = "-0.3 — -0.2", -0.2 =
"-0.2 — -0.1", -0.1 = "-0.1 — 0", 0 = "0 — 0.1", 0.1 = "0.1 — 0.2", 0.2 =
"0.2 — 0.3", 0.3 = "0.3 — 0.4", 0.4 = "0.4 — 0.5", 0.5 = "0.5 — 0.6", 0.6 =
"0.6 — 0.7", 0.7 = "0.7 — 0.8", 0.8 = "0.8 — 0.9", 0.9 = "0.9 — 1", 1 =
"1 — 1.1", 1.1 = "1.1 — 1.2", 1.2 = "1.2 — 1.3", 1.3 = "1.3 — 1.4", 1.4 =
"1.4 — 1.5", 1.5 = "1.5 — 1.6", 1.6 = "1.6 — 1.7", 1.7 = "1.7 — 1.8", 1.8 =
"1.8 — 1.9", 1.9 = "1.9 — 2"}
),
Use Value Labels( 1 ),
Formula( 0.5 + 0.1 * Floor( (:Score - 0.5) / 0.1 ) )
)Zwei Dinge hier: Wir kümmern uns nicht um Punkte unter 0,5 (sie sind in Ihrer Beschreibung nicht vorhanden) oder über 1, sodass wir die Eigenschaften ein wenig ändern und die Beschriftungsnamen so bearbeiten können, dass sie Ihren Wünschen entsprechen. Ich habe auch eine If-Anweisung hinzugefügt, um den Randfall zu erfassen, bei dem eine Punktzahl genau 1 ist
Add Column Properties(
Value Labels(
{0.5 = "0.5 — 0.59", 0.6 = "0.6 — 0.69", 0.7 = "0.7 — 0.79", 0.8 = "0.8 — 0.89", 0.9 =
"0.9 — 1"}
),
Use Value Labels( 1 ),
Formula(
If(
(0.5 + 0.1 * Floor( (:Score - 0.5) / 0.1 )) == 1, 0.9,
0.5 + 0.1 * Floor( (:Score - 0.5) / 0.1 )
)
)
);(Übrigens sind diese Etiketten technisch nicht genau, da 0,599 zwischen 0,5 und 0,59 liegen würde.)
Wir können Code um dieses Snippet wickeln, um es wiederverwendbar zu machen. Dabei verwenden wir die aktuelle Datentabelle, fügen eine neue Spalte mit dem Namen Score Binned hinzu und fügen diese Eigenschaften dieser Spalte hinzu:
dt = Current Data Table();
dt << New Column("Score Binned", Character);
dt:"Score Binned"n << Add Column Properties(
Value Labels(
{0.5 = "0.5 — 0.59", 0.6 = "0.6 — 0.69", 0.7 = "0.7 — 0.79", 0.8 = "0.8 — 0.89", 0.9 =
"0.9 — 1"}
),
Use Value Labels( 1 ),
Formula(
If(
(0.5 + 0.1 * Floor( (:Score - 0.5) / 0.1 )) == 1, 0.9,
0.5 + 0.1 * Floor( (:Score - 0.5) / 0.1 )
)
)
);Zurück auf unserem Tisch bringt uns Tabellen> Zusammenfassung dahin, wohin wir wollen. Wir haben Group und Score Binned in Group zusammengefasst, und das ist alles, was wir tatsächlich brauchen:


Nun, N Zeilen ist das, was wir wollen, es heißt nur falsch. Doppelklicken Sie also links auf das Wort "Quelle", kopieren Sie das Skript zur Tabellenerstellung und ersetzen Sie die benannte Tabellenreferenz durch "dt", unsere Arbeitstabelle, und catch die neue Tabelle in der Variablen "summ":

dt = Current Data Table();
dt << New Column("Score Binned", Character);
dt:"Score Binned"n << Add Column Properties(
Value Labels(
{0.5 = "0.5 — 0.59", 0.6 = "0.6 — 0.69", 0.7 = "0.7 — 0.79", 0.8 = "0.8 — 0.89", 0.9 =
"0.9 — 1"}
),
Use Value Labels( 1 ),
Formula(
If(
(0.5 + 0.1 * Floor( (:Score - 0.5) / 0.1 )) == 1, 0.9,
0.5 + 0.1 * Floor( (:Score - 0.5) / 0.1 )
)
)
);
summ = dt << Summary(
Group( :Group, :Score Binned ),
Freq( "None" ),
Weight( "None" )
);Benennen Sie abschließend N Zeilen wie gewünscht in "Total_Count" um:
dt = Current Data Table();
dt << New Column("Score Binned", Character);
dt:"Score Binned"n << Add Column Properties(
Value Labels(
{0.5 = "0.5 — 0.59", 0.6 = "0.6 — 0.69", 0.7 = "0.7 — 0.79", 0.8 = "0.8 — 0.89", 0.9 =
"0.9 — 1"}
),
Use Value Labels( 1 ),
Formula(
If(
(0.5 + 0.1 * Floor( (:Score - 0.5) / 0.1 )) == 1, 0.9,
0.5 + 0.1 * Floor( (:Score - 0.5) / 0.1 )
)
)
);
summ = dt << Summary(
Group( :Group, :Score Binned ),
Freq( "None" ),
Weight( "None" )
);
summ:"N Rows"n << Set Name("Total_Count");Schließen Sie nun die Übersichtstabelle, löschen Sie die Spalte Score Binned aus der Quelltabelle und testen Sie das Skript:

Nochmals letzte JSL:
dt = Current Data Table();
dt << New Column("Score Binned", Character);
dt:"Score Binned"n << Add Column Properties(
Value Labels(
{0.5 = "0.5 — 0.59", 0.6 = "0.6 — 0.69", 0.7 = "0.7 — 0.79", 0.8 = "0.8 — 0.89", 0.9 =
"0.9 — 1"}
),
Use Value Labels( 1 ),
Formula(
If(
(0.5 + 0.1 * Floor( (:Score - 0.5) / 0.1 )) == 1, 0.9,
0.5 + 0.1 * Floor( (:Score - 0.5) / 0.1 )
)
)
);
summ = dt << Summary(
Group( :Group, :Score Binned ),
Freq( "None" ),
Weight( "None" )
);
summ:"N Rows"n << Set Name("Total_Count");Getestet auf Ihren angehängten Daten, die mir buchstäblich gerade aufgefallen sind:flushed_face:

Hier sind einige Möglichkeiten, dies zu tun.Da das folgende Beispiel jedoch nur auf der primären JMP-Funktionalität basiert, empfehle ich dringend, dass Sie das Discovering JMP und die Using JMP-Dokumente aus der JMP-Dokumentationsbibliothek lesen, die im Pulldown-Menü Hilfe verfügbar ist.
Names Default To Here( 1 );
dt = Current Data Table();
dt << New Column( "Score Category",
character,
formula(
If(
:Score < .6, "0.50-0.59",
:Score < .8, "0.60-0.79",
:Score < .9, "0.80-0.89",
"0.90-1.00",
)
)
);
dtSum = dt << Summary(
Group( :Group, :Score Category ),
Sum( :Count ),
Freq( "None" ),
Weight( "None" ),
Link to original data table( 0 )
);
dtSum << delete columns( :N Rows );
dtSum:Name( "Sum(Count)" ) << set name( "Total_Count" );
// or
dt:score << set property(
"value labels",
{0.5 <= "0.50-0.59" < 0.6, 0.6 <= "0.60-0.79" < 0.8, 0.8 <= "0.80-0.89" < 0.9, 0.9
<= "0.90-1.00" <= 1}
);
dtSum = dt << Summary(
Group( :Group, :Score ),
Sum( :Count ),
Freq( "None" ),
Weight( "None" ),
Link to original data table( 0 )
);
dtSum << delete columns( :N Rows );
dtSum:Name( "Sum(Count)" ) << set name( "Total_Count" );