¿Cómo usar JSL para clasificar y resumir los datos en el medio de la rama de la matriz y obtener los resultados resumidos en forma de matriz?

¡Gracias Expertos!
dt=Open("$SAMPLE_DATA/Big Class.jmp");
ar=dt<<GETASMATRIX></GETASMATRIX>
No estoy seguro de que sea la mejor manera de obtener su resultado final, pero si quisiera hacerlo usando solo matrices, puede:
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);¡Gracias ian! Así es como funciona este ciclo.
ar=dt<<GETASMATRIX></GETASMATRIX>
Este es un enfoque que evita los bucles, aunque crea tablas invisibles. Si el rendimiento es adecuado para sus necesidades, este enfoque es fácil de usar y comprender.
Salud,
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);EDITAR:
Noté un error tipográfico en la versión original del código a continuación, que he corregido. En la última línea, el error tipográfico fue:
nrow (s)
En su lugar, use:
nrow (h)
Por supuesto, nrow (n) o nrow (m) también funcionarían ya que cada uno de los vectores h, nym tienen el mismo número de filas.
Lo siento por eso.
Salud,
Brady
///////////////////////////// Publicación original:
Al analizar el rendimiento del enfoque basado en tablas, es mucho más lento que los enfoques basados en matrices, lo que podría contrarrestar su simplicidad, dependiendo de su tabla.
Aquí hay otro enfoque basado en matrices; si bien funciona de manera similar a la que publicó Ian, la incluyo por algunas razones: a) para presentar la idea de una columna "seleccionada", que marca 1 si se selecciona una fila y 0 en caso contrario, b) para mostrar un "truco "de la función de resumen yc) porque esto evita los bucles y los posibles errores de indexación asociados con ellos.
Primero: la columna "Seleccionado". En la primera línea del código a continuación, agregamos una nueva columna a la tabla, que se establece en 1 en las filas seleccionadas y 0 en el resto. Esto nos permite crear una columna de agrupación adicional, con el objetivo de utilizar plataformas basadas en tablas y funciones como Resumen y Resumen, sin tener que crear nuevas tablas.
A continuación, el truco Summarize (): tenga en cuenta que agrupamos por: selected y: height. Mientras que los valores h, nym se devuelven en matrices, los valores de by variable (s) se colocan en listas de cadenas ... incluso si PODRÍAN colocarse en matrices. Entonces, en este caso, b es una lista de dos listas de cadenas. Por lo tanto, si queremos cualquiera de estos valores en forma de matriz, podemos convertir la lista deseada de cadenas en una matriz (que es costosa si la lista es grande) o podemos calcular una estadística "barata", como Mín o Máx. en la misma columna, para obtener esos valores ... que es lo que hacemos a continuación para la columna de altura.
Salud,
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