Problema
Problema 1: devo ottenere un elenco dei valori univoci in una colonna della tabella dati.
Problema 2: devo ottenere un elenco dei valori univoci in una struttura dati JSL (lista o matrice)
Soluzione
Per il problema 1:
Soluzione 1: Usa tabelle riassuntive.Il JSL seguente mostra come utilizzare Summary() per ottenere una tabella che avrà una riga con ogni valore univoco in una singola colonna.È quindi possibile eseguire ulteriori comandi della tabella JSL per ottenere quei valori dalla tabella di riepilogo.
_dt = Open( "$sample_data/big class.jmp" );
//create a summary table of the :sex column
_dt1 = _dt << Summary(
Group( :sex ),
Freq( "None" ),
Weight( "None" )
);
//create a summary table of the :age column
_dt2 = _dt << Summary(
Group( :age ),
Freq( "None" ),
Weight( "None" )
);
<SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2-13-2018 5-22-08 PM.png" style="width: 280px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="2-13-2018 5-22-08 PM.png" style="width: 280px;"><span class="lia-inline-image-display-wrapper" image-alt="2-13-2018 5-22-08 PM.png" style="width: 280px;"><img src="https://us.v-cdn.net/6038925/uploads/images/9328i5A075F342798D202/2-13-2018%205-22-08%20PM.png" role="button" title="2-13-2018 5-22-08 PM.png" alt="2-13-2018 5-22-08 PM.png" /></span></SPAN></SPAN>
Problema 2:
Ora, invece di una tabella di dati, hai un elenco o una matrice JMP:
sexlist = {"F", "M", "M", "F", "F", "M", "M", "F", "M"};
agelist = [14, 11, 12, 13, 15, 17, 15, 11, 12];i modi complicati per farlo sarebbero:
a) inserire i valori nell'elenco in una nuova colonna della tabella dati, quindi utilizzare l'approccio riepilogativo, OR
b) scrivere un ciclo for un po' complicato per cercare e registrare valori univoci
Fortunatamente, esiste un modo più semplice, utilizzando gli array associativi.
Associative Array(sexlist) << Get Keys;
Associative Array(agelist) << Get Keys;
restituisce rispettivamente {"F", "M"} e {11, 12, 13, 14, 15, 17} (nota che si tratta di un bell'elenco ordinato!).Se desideri i valori numerici come vettore ordinato, puoi utilizzare
Matrix(Associative Array(agelist) << Get Keys);
che restituisce [11, 12, 13, 14, 15, 17].
Questo approccio può essere utilizzato anche al posto della Soluzione 1 per il Problema 1:
Problema 1, Soluzione 2:Associative Array(Column(_dt, "sex") << Get Values) << Get Keys;<BR />Matrix(Associative Array(Column(_dt, "age")<< Get Values)<<GET keys=""></GET>
ritorna {"F", "M"} e [11, 12, 13, 14, 15, 17]., rispettivamente. Quello che sta facendo è
- ottenere i valori dalla colonna specificata come un elenco (se la colonna è carattere) o una matrice (se la colonna è numerica)
- trasforma quella lista o matrice in un array associativo
- ottenere le chiavi per l'array associativo, che in questo caso sono i livelli univoci dei valori nella colonna, restituendolo come un elenco
- (se Matrix() viene utilizzato nell'elenco risultante, funzionerà solo se i valori nell'elenco sono tutti numeri).
Summarize() è molto più efficiente dell'array associativo, è molto ovvio con 2 milioni di righe di dati (intervallo di tempo di 1 secondo contro 8 secondi). Se le prestazioni sono critiche, utilizzare Summarize() quando possibile.
Riassumi( dt, smrz1 = by( :sex ) ); Riassumi( dt, smrz2 = by( :age ) );
* Summarize() non crea una tabella dati intermedia come << Summary
Associative Array è eccezionale nel modo in cui risparmia lo sforzo di inserire l'elenco/matrice nella tabella dei dati, questa è la soluzione perfetta per dati di piccole dimensioni.