Problem
Problem 1: Ich benötige eine Liste der eindeutigen Werte in einer Datentabellenspalte.
Problem 2: Ich benötige eine Liste der eindeutigen Werte in einer JSL-Datenstruktur (Liste oder Matrix)
Lösung
Zu Problem 1:
Lösung 1: Verwenden Sie Übersichtstabellen.Die folgende JSL zeigt, wie Sie mit Summary() eine Tabelle erhalten, die eine Zeile mit jedem eindeutigen Wert in einer einzelnen Spalte enthält.Anschließend können Sie weitere JSL-Tabellenbefehle ausführen, um diese Werte aus der Übersichtstabelle abzurufen.
_dt = Open( "$sample_data/big class.jmp" );
//create a summary table of the :sex column
_dt1 = _dt << Summary(
Group( :sex ),
Freq( "None" ),
Weight( "None" )
);
//create a summary table of the :age column
_dt2 = _dt << Summary(
Group( :age ),
Freq( "None" ),
Weight( "None" )
);
<SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2-13-2018 5-22-08 PM.png" style="width: 280px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="2-13-2018 5-22-08 PM.png" style="width: 280px;"><span class="lia-inline-image-display-wrapper" image-alt="2-13-2018 5-22-08 PM.png" style="width: 280px;"><img src="https://us.v-cdn.net/6038925/uploads/images/9328i5A075F342798D202/2-13-2018%205-22-08%20PM.png" role="button" title="2-13-2018 5-22-08 PM.png" alt="2-13-2018 5-22-08 PM.png" /></span></SPAN></SPAN>
Problem 2:
Anstelle einer Datentabelle haben Sie jetzt eine JMP-Liste oder -Matrix:
sexlist = {"F", "M", "M", "F", "F", "M", "M", "F", "M"};
agelist = [14, 11, 12, 13, 15, 17, 15, 11, 12];Die komplizierten Möglichkeiten, dies zu tun, wären:
a) Fügen Sie die Werte in der Liste in eine neue Datentabellenspalte ein und verwenden Sie dann den Zusammenfassungsansatz ODER
b) Schreiben Sie eine etwas komplizierte for-Schleife, um nach eindeutigen Werten zu suchen und diese aufzuzeichnen
Glücklicherweise gibt es einen einfacheren Weg: die Verwendung assoziativer Arrays.
Associative Array(sexlist) << Get Keys;
Associative Array(agelist) << Get Keys;
gibt {"F", "M"} bzw. {11, 12, 13, 14, 15, 17} zurück (beachten Sie, dass es sich um eine gut sortierte Liste handelt!).Wenn Sie die numerischen Werte als sortierten Vektor möchten, können Sie verwenden
Matrix(Associative Array(agelist) << Get Keys);
was [11, 12, 13, 14, 15, 17] zurückgibt.
Dieser Ansatz kann auch anstelle von Lösung 1 für Problem 1 verwendet werden:
Problem1, Lösung 2:Associative Array(Column(_dt, "sex") << Get Values) << Get Keys;<BR />Matrix(Associative Array(Column(_dt, "age")<< Get Values)<<GET keys=""></GET>
kehrt zurück {"F", "M"} bzw. [11, 12, 13, 14, 15, 17]. Was dies bewirkt, ist
- Rufen Sie die Werte aus der angegebenen Spalte als Liste (wenn die Spalte ein Zeichen ist) oder als Matrix (wenn die Spalte numerisch ist) ab.
- Verwandeln Sie diese Liste oder Matrix in ein assoziatives Array
- Rufen Sie die Schlüssel für das assoziative Array ab, in diesem Fall die eindeutigen Ebenen der Werte in der Spalte, und geben Sie diese als Liste zurück
- (Wenn Matrix() für die resultierende Liste verwendet wird, funktioniert es nur, wenn die Werte in der Liste alle Zahlen sind).
Summarize() ist viel effizienter als assoziative Arrays, was bei 2 Millionen Datenzeilen (1 Sekunde gegenüber 8 Sekunden Zeitraffer) sehr deutlich wird. Wenn die Leistung entscheidend ist, verwenden Sie nach Möglichkeit Summarize().
Summarize( dt, smrz1 = by( :sex ) ); Summarize( dt, smrz2 = by( :age ) );
* Summarize() erstellt keine Zwischendatentabelle als << Zusammenfassung
Assoziative Arrays sind insofern großartig, als sie den Aufwand sparen, die Liste/Matrix in eine Datentabelle einzufügen. Dies ist die perfekte Lösung für kleine Datenmengen.