Para "Big Class.jmp", las columnas "altura" y "peso" se escriben en la matriz.
Luego, los datos en las filas 6 a 35 de la matriz se clasifican y resumen: se resume el peso promedio de cada altura. Este resultado solo necesita almacenarse en la matriz en memoria.

¡Gracias expertos!
dt=Open("$SAMPLE_DATA/Big Class.jmp");
ar=dt<<GETASMATRIX></GETASMATRIX>
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 era:
fila (s)
En su lugar, utilice:
fila (h)
Por supuesto, nrow(n) o nrow(m) también funcionarían ya que cada uno de los vectores h, n y m tienen el mismo número de filas.
Lo lamento.
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 compensar su simplicidad, según su tabla.
Aquí hay otro enfoque basado en matrices; Si bien funciona de manera similar a la que publicó Ian, la incluyo por varias 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 y c) porque esto evita los bucles y las posibles dificultades de indexación asociadas con ella.
Primero: la columna "Seleccionados". 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 y funciones basadas en tablas como Summary y Summarize, sin tener que crear nuevas tablas.
A continuación, el truco Resumir (): tenga en cuenta que agrupamos por: seleccionado y: altura. Mientras que los valores h, n y m se devuelven en matrices, los valores por 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 Min o Max, 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
Aquí hay 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);¡Gracias! Así es como funciona este ciclo.
ar=dt<<GETASMATRIX></GETASMATRIX>
No estoy seguro de que sea la mejor manera de obtener el 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);