Hallo,
Ich habe Daten mit etwa 5000 Zeilen.
Es gibt drei Spalten (Gruppe, Punktzahl und Anzahl)
Wert für Gruppe: A, B
Der Wert für die Punktzahl liegt zwischen 0,5 und 1
Der Wert für „Anzahl“ ist 1 für jede Zeile.

Ich möchte die Daten nach Gruppe A und B zusammenfassen und den Score-Wert in einige Kategorien gruppieren und dann die Anzahl für jede Score-Kategorie summieren, wie im folgenden Format.

Ich bitte die Community um Hilfe. Wie erstelle ich ein JSL-Skript, um diese Aufgabe auszuführen?
Auch hier füge ich Daten bei.
Danke
Hier sind einige Möglichkeiten, dies zu tun.Da das folgende Beispiel aber eigentlich nur auf der primären JMP-Funktionalität basiert, empfehle ich Ihnen dringend, die Dokumente „Discovering JMP“ und „Using JMP“ aus der JMP-Dokumentationsbibliothek zu 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" );Ich würde einen interaktiven Ansatz verwenden, um ein Skript dafür zu erstellen. Beginnen wir zunächst mit der Datentabelle:

Ich habe Count weggelassen, weil wir es nicht brauchen werden, aber es wird nicht schaden, wenn es da ist.
Ich habe die Spalte „Score“ ausgewählt und bin dann zu „Cols“, „Utilities“, „Make Binning Formula“ navigiert:

Und setzen Sie den Offset auf 0,5 und die Bin-Breite auf 0,1:

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 es ein (Strg-V), 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 ) )
)Hier zwei Dinge: Es sind uns egal, ob die Werte kleiner als 0,5 (in Ihrer Beschreibung nicht vorhanden) oder größer als 1 sind, daher können wir die Eigenschaften ein wenig ändern und die Bezeichnungsnamen so bearbeiten, dass sie Ihren Wünschen entsprechen. Ich habe außerdem eine If-Anweisung hinzugefügt, um den Grenzfall 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 Bezeichnungen technisch nicht korrekt, da 0,599 als zwischen 0,5 und 0,59 gekennzeichnet wäre)
Wir können diesen Codeausschnitt umschließen, um ihn wiederverwendbar zu machen. Dabei verwenden wir die aktuelle Datentabelle, fügen eine neue Spalte mit dem Namen „Score Binned“ hinzu und fügen dieser Spalte diese Eigenschaften 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 führt uns „Tabellen“ > „Zusammenfassung“ dorthin, wohin wir wollen. Wir fügen Group und Score Binned in Group ein, und das ist alles, was wir eigentlich brauchen:


Nun, N Zeilen ist das, was wir wollen, es hat nur den falschen Namen, also doppelklicken wir links auf das Wort „Quelle“, kopieren das Tabellenerstellungsskript und ersetzen die benannte Tabellenreferenz durch „dt“, unsere Arbeitstabelle, und fangen die neue Tabelle in der Variablen „summ“ ab:

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 Rows 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 anhand Ihrer angehängten Daten, die mir gerade erst aufgefallen sind :lushed_face:
