Per "Big Class.jmp", le colonne "altezza" e "peso" vengono scritte nella matrice.
Quindi i dati nelle righe da 6 a 35 della matrice vengono classificati e riepilogati: viene riepilogato il peso medio di ciascuna altezza. Questo risultato deve solo essere memorizzato nella matrice in memoria.

Grazie Esperti!
dt=Open("$SAMPLE_DATA/Big Class.jmp");
ar=dt<<GETASMATRIX></GETASMATRIX>
MODIFICARE:
Ho notato un errore di battitura nella versione originale del codice qui sotto, che ho corretto. Nell'ultima riga, l'errore di battitura era:
ora (e)
Invece, usa:
adesso (h)
Naturalmente, anche nrow (n) o nrow(m) funzionerebbero poiché ciascuno dei vettori h, n ed m ha lo stesso numero di righe.
Mi dispiace per questo.
Saluti,
Brady
////////////////////////////////Post originale:
Nell'esaminare le prestazioni dell'approccio basato su tabella, è molto più lento degli approcci basati su matrice, il che potrebbe controbilanciare la sua semplicità, a seconda della tabella.
Ecco un altro approccio basato su matrice; mentre si comporta in modo simile a quello pubblicato da Ian, lo includo per alcuni motivi: a) per introdurre l'idea di una colonna "selezionata", che contrassegna 1 se una riga è selezionata e 0 in caso contrario, b) per mostrare un "hack" della funzione di riepilogo e c) perché questo evita il looping e le potenziali insidie dell'indicizzazione ad esso associate.
Primo: la colonna "Selezionato". Nella prima riga del codice seguente, aggiungiamo una nuova colonna alla tabella, che si imposta su 1 nelle righe selezionate e 0 altrove. Questo ci consente di creare una colonna di raggruppamento aggiuntiva, con l'obiettivo di utilizzare piattaforme basate su tabelle e funzioni come Riepilogo e Riepiloga, senza dover creare nuove tabelle.
Successivamente, l'hack Summarize(): si noti che raggruppiamo per :selected e :height. Mentre i valori h, n e m vengono restituiti nelle matrici, i valori delle variabili by vengono inseriti in elenchi di stringhe... anche se POTREBBERO essere inseriti in matrici. Quindi in questo caso b è una lista di due liste di stringhe. Quindi, se vogliamo uno qualsiasi di questi valori in forma di matrice, possiamo convertire l'elenco di stringhe desiderato in una matrice (che è costoso se l'elenco è grande) oppure possiamo calcolare una statistica "economica", come Min o Max, sulla stessa colonna, per ottenere quei valori... che è quello che facciamo sotto per la colonna dell'altezza.
Saluti,
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
Ecco un approccio che evita i cicli, sebbene crei tabelle invisibili. Se le prestazioni sono adeguate alle tue esigenze, questo approccio è semplice da usare e da capire.
Saluti,
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);Grazie Ian! Questo è il modo in cui funziona questo ciclo.
ar=dt<<GETASMATRIX></GETASMATRIX>
Non sono sicuro che sia il modo migliore per ottenere il risultato finale, ma se volessi farlo usando solo matrici puoi:
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);