Equivalente di get rows dove per più arrayCiao,
Questa sembra una domanda abbastanza semplice, ma probabilmente sto usando i termini di ricerca sbagliati perché non ho trovato una buona risposta.
Ho uno script in cui inizialmente stavo solo creando un elenco di stringhe (percorsi di file) e potevo usarle in ordine sequenziale senza problemi. Man mano che l'ambito si espandeva, ora devo filtrare in base ai criteri in altri due elenchi della stessa lunghezza che sono stati creati contemporaneamente. Il mio cervello funziona ancora nelle tabelle di dati e in un formato di tabella di dati (o SQL) sarebbe una cosa facile da fare. La creazione di una tabella di dati nascosta potrebbe essere un'opzione praticabile, ma mi piacerebbe capire meglio lavorare con diverse strutture di dati e cambiare il mio codice per usare un altro dt sembra disordinato.
Sembra un'applicazione per array associativi, ma sto lottando per creare correttamente l'array e la guida di scripting e l'indice di scripting non sono stati illuminanti. Qualcuno può indicarmi la giusta direzione o suggerire una struttura di dati che avrebbe più senso per quello che sto cercando di fare ora? O un tavolo nascosto sarebbe effettivamente l'opzione migliore?
Si noti inoltre che in questo esempio ho tre elenchi individuali. Nella mia attuale applicazione ogni elenco è contenuto nel proprio elenco in cui List_A[1] corrisponde a List_B[1], ecc., ma sto iterando attraverso gli elenchi principali.
Grazie!
Names Default To Here( 1 );
//example data is in dt, my data isn't
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
//this is more or less the structure of the data that I have
sex_list = dt:sex << get values;
height_list = dt:height << get values;
weight_list = dt:weight << get values;
//this is what I would do if I had the data in a dt
output = dt:weight[dt << get rows where(and(:age == 13, :sex == "M"))];
show(output);
//how to do this with the data in a structure with no dt? what structure would be appropriate?
Automazione e scriptingRe: Equivalente di get rows dove per più arrayLe tabelle di dati JMP sono facili da interrogare e sono piuttosto veloci (a seconda della query), quindi molto probabilmente le userei privato o tabella di dati invisibile.Se vuoi davvero usare l'array associativo, penso che dovresti creare molte chiavi univoche come "13_M" per indicare l'età == 13 e il sesso == "M".
Re: Equivalente di get rows dove per più arrayLa funzione loc() per trovare gli elementi in un elenco o in una matrice. Utilizzare gli array associativi per intersecare diversi elenchi di indici. Ri: Modo rapido per confrontare due liste (elementi non comuni)?
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
name_list = dt:name << get values;// a list
sex_list = dt:sex << get values;// a list
age_list = dt:age << get values;// a matrix
weight_list = dt:weight << get values;
age_rows = Loc( 13 <= age_list <= 14 );
sex_rows = Loc( sex_list, "M" );
// intersection of those https://community.jmp.com/t5/Discussions/Quick-way-to-compare-two-lists-and-identify-the-uncommon/m-p/5811
intersect = Associative Array( age_rows );// uses two associative arrays
intersect << intersect( Associative Array( sex_rows ) ); // perform the intersection
intersect = intersect << getkeys; // get the answers
For Each( {key}, intersect, Write( Eval Insert( "\!n^name_list[key]^ \!t^age_list[key]^ \!t^sex_list[key]^ \!t^weight_list[key]^" ) ) );
/*
JOHN 13 M 98
JOE 13 M 105
MICHAEL 13 M 95
DAVID 13 M 79
FREDERICK 14 M 93
ALFRED 14 M 99
HENRY 14 M 119
LEWIS 14 M 92
EDWARD 14 M 112
CHRIS 14 M 99
JEFFREY 14 M 113
*/Re: Equivalente di get rows dove per più arrayGrazie Craige, Jarmo! Quindi è sicuramente possibile fare con gli array, ma ci vogliono alcuni passaggi, quindi sembra che JSL sia più progettato per utilizzare una tabella invisibile/privata in un caso come questo (quindi perché non trovavo risposte ovvie).