Wie verwende ich JSL, um die Daten in der Mitte des Matrixzweigs zu klassifizieren und zusammenzufassen und die Zusammenfassungsergebnisse in Form einer Matrix zu erhalten?Wie verwende ich JSL, um die Daten in der Mitte des Matrixzweigs zu klassifizieren und zusammenzufassen und die Zusammenfassungsergebnisse in Form einer Matrix zu erhalten?

Vielen Dank Experten!
dt=Open("$SAMPLE_DATA/Big Class.jmp");
ar=dt<<GETASMATRIX></GETASMATRIX>
SkriptingBetreff: Wie verwende ich JSL, um die Daten in der Mitte des Matrixzweigs zu klassifizieren und zusammenzufassen und die Zusammenfassungsergebnisse in Form einer Matrix zu erhalten?Ich bin mir nicht sicher, ob dies der beste Weg ist, um Ihr Endergebnis zu erzielen, aber wenn Sie es nur mit Matrizen tun möchten, können Sie:
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);Betreff: Wie verwende ich JSL, um die Daten in der Mitte des Matrixzweigs zu klassifizieren und zusammenzufassen und die Zusammenfassungsergebnisse 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 Zusammenfassungsergebnisse 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 zu verwenden und zu verstehen.
Prost,
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 verwendet man 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 ein Tippfehler in der Originalversion des folgenden Codes aufgefallen, den ich korrigiert habe. In der letzten Zeile war der Tippfehler:
neu (n)
Verwenden Sie stattdessen:
jetzt (h)
Natürlich würde nrow (n) oder nrow (m) auch funktionieren, da jeder der Vektoren h, n und m die gleiche Anzahl von Zeilen hat.
Das tut mir leid.
Beifall,
Brady
/////////////////////////////Originalbeitrag:
Bei der Untersuchung der Leistung des tabellenbasierten Ansatzes ist er viel langsamer als der matrixbasierte Ansatz, was seine Einfachheit je nach Tabelle zunichte machen könnte.
Hier ist ein weiterer matrixbasierter Ansatz; Obwohl es sich ähnlich verhält wie das, das Ian gepostet hat, füge ich es aus einigen Gründen hinzu: a) um die Idee einer "ausgewählten" Spalte einzuführen, die 1 markiert, wenn eine Zeile ausgewählt ist und ansonsten 0, b) um einen "Hack" anzuzeigen " der Zusammenfassungsfunktion und c) weil dies Schleifen und die damit verbundenen möglichen Indizierungsfallen vermeidet.
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 verwenden, 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 Werte h, n und m in Matrizen zurückgegeben werden, werden die Werte von by-Variable(n) in Listen von Strings platziert... selbst wenn sie in Matrizen platziert werden KÖNNTEN. In diesem Fall ist b also eine Liste von zwei Listen von Strings. Wenn wir also einen dieser Werte in Matrixform haben möchten, können wir entweder die gewünschte Liste von Strings in eine Matrix umwandeln (was teuer ist, wenn die Liste groß ist) oder wir können eine "billige" Statistik wie Min oder Max berechnen. in derselben Spalte, 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