Wie kann ich JSL verwenden, um die Daten in der Mitte des Matrixzweigs zu klassifizieren und zusammenzufassen und die zusammenfassenden Ergebnisse in Form einer Matrix zu erhalten?Für „Big Class.jmp“ werden die Spalten „height“ und „weight“ in die Matrix geschrieben.
Anschließend werden die Daten in den Zeilen 6 bis 35 der Matrix klassifiziert und zusammengefasst: Das Durchschnittsgewicht jeder Körpergröße wird zusammengefasst. Dieses Ergebnis muss nur in der In-Memory-Matrix gespeichert werden.

Danke Experten!
dt=Open("$SAMPLE_DATA/Big Class.jmp");
ar=dt<<GETASMATRIX></GETASMATRIX>
Erweiterte statistische ModellierungInhaltsorganisationDatenexploration und -visualisierungErgebnisse teilen und kommunizierenBetreff: Wie verwende ich JSL, um die Daten in der Mitte des Matrixzweigs zu klassifizieren und zusammenzufassen und die zusammenfassenden Ergebnisse in Form einer Matrix zu erhalten?BEARBEITEN:
Mir ist in der Originalversion des folgenden Codes ein Tippfehler aufgefallen, den ich korrigiert habe. In der letzten Zeile war der Tippfehler:
schmal(er)
Verwenden Sie stattdessen:
eng (h)
Natürlich würde auch nrow (n) oder nrow(m) funktionieren, da jeder der Vektoren h, n und m die gleiche Anzahl an Zeilen hat.
Das tut mir leid.
Beifall,
Brady
/////////////////////////////Originalbeitrag:
Wenn man sich die Leistung des tabellenbasierten Ansatzes ansieht, ist er viel langsamer als Matrix-basierte Ansätze, was seine Einfachheit je nach Tabelle möglicherweise zunichte macht.
Hier ist ein weiterer Matrix-basierter Ansatz; Obwohl es ähnlich funktioniert wie das, was Ian gepostet hat, füge ich es aus mehreren Gründen hinzu: a) um die Idee einer „ausgewählten“ Spalte einzuführen, die 1 markiert, wenn eine Zeile ausgewählt ist, und andernfalls 0, b) um einen „Hack“ der Zusammenfassungsfunktion zu zeigen und c) weil dadurch Schleifen und die damit verbundenen potenziellen Indizierungsfallen vermieden werden.
Erstens: die Spalte „Ausgewählt“. In der ersten Zeile des folgenden Codes fügen wir der Tabelle eine neue Spalte hinzu, die sich in ausgewählten Zeilen auf 1 und an anderer Stelle auf 0 setzt. Dadurch können wir eine zusätzliche Gruppierungsspalte erstellen, mit dem Ziel, tabellenbasierte Plattformen und Funktionen wie „Summary“ und „Summarize“ zu nutzen, ohne neue Tabellen erstellen zu müssen.
Als nächstes der Summarize()-Hack: Beachten Sie, dass wir nach :selected und :height gruppieren. Während die h-, n- und m-Werte in Matrizen zurückgegeben werden, werden die by-Variable(n)-Werte in Listen von Zeichenfolgen platziert ... selbst wenn sie in Matrizen platziert werden könnten. In diesem Fall ist b also eine Liste von zwei Listen mit Zeichenfolgen. Wenn wir also einen dieser Werte in Matrixform haben möchten, können wir entweder die gewünschte Liste von Zeichenfolgen in eine Matrix umwandeln (was teuer ist, wenn die Liste groß ist) oder wir können eine „billige“ Statistik wie Min oder Max für dieselbe Spalte berechnen, um diese Werte zu erhalten ... was wir unten für die Höhenspalte tun.
Beifall,
Brady
dt << New Column( "Selected", formula( Selected( Row State() ) ) );
dt << Select Rows( 6 :: 35 );
Summarize( dt, b = by( :Selected, :height ), h = max( :height), n = Count( :weight ), m = Mean( :weight ) );
sumMat = (h || n || m)[contains(b[1], "1"):: nrow(h),0]; //only use the results where selected == 1
Betreff: Wie verwende ich JSL, um die Daten in der Mitte des Matrixzweigs zu klassifizieren und zusammenzufassen und die zusammenfassenden Ergebnisse in Form einer Matrix zu erhalten?Hier ist ein Ansatz, der Schleifen vermeidet, obwohl unsichtbare Tabellen erstellt werden. Wenn die Leistung Ihren Anforderungen entspricht, ist dieser Ansatz einfach anzuwenden und zu verstehen.
Beifall,
Brady
dt = open("$Sample_Data/Big Class.jmp");
dtSub = dt << subset(rows(6::35), invisible);
dtsum = dtsub << summary(group(:height), mean(weight), invisible);
mat = dtSum << get as Matrix;
close(dtSum, nosave);
close(dtSub, nosave);
show(mat);Betreff: Wie verwende ich JSL, um die Daten in der Mitte des Matrixzweigs zu klassifizieren und zusammenzufassen und die zusammenfassenden Ergebnisse in Form einer Matrix zu erhalten?Danke, Ian! So funktioniert dieser Zyklus.
ar=dt<<GETASMATRIX></GETASMATRIX>
Betreff: Wie verwende ich JSL, um die Daten in der Mitte des Matrixzweigs zu klassifizieren und zusammenzufassen und die zusammenfassenden Ergebnisse in Form einer Matrix zu erhalten?Ich bin mir nicht sicher, ob dies der beste Weg ist, um Ihr Endergebnis zu erhalten, aber wenn Sie es nur mit Matrizen machen möchten, können Sie Folgendes tun:
NamesDefaultToHere(1);
// Sample data
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// Matrix with all 'height' and 'weight' values
ar = dt << GetAsMatrix({4,5});
// Discard rows
ar = ar[6::35, 0];
// Find out the distinct levels of 'height'
hl = Matrix(AssociativeArray(ar[0,1]) << getKeys);
// Build the average 'weight' for each level into a new matrix 'rm'
rm = J(NRow(hl), 2, .);
for(h=1, h<=NRow(hl), h++,
rm[h, 1] = hl[h];
rm[h, 2] = VMean(ar[Loc(ar[0, 1] == hl[h]), 2]);
);
Print(rm);