Converti array in stringaCiao a tutti,
Sto cercando di ottenere un valore da un array da un'altra tabella e usarlo come valore per la mia selezione. C'è un modo per convertire l'array in una stringa?
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
merged_file << select where(:Name_final==name_key);
Modellazione statistica avanzataPersonalizzazione di massaRe: Convertire array in stringaCraig,
Ancora una volta ho imparato qualcosa di nuovo su JMP.Inizialmente avevo scritto il codice utilizzando una funzione Contains(), ma poi mi sono convertito all'utilizzo della funzione Loc(), perché quello che pensavo sarebbe stato un problema in cui
Contains( "BARBARA ANN", "BARBARA")
restituisce un vero.
Avevo (erroneamente risulta) che se il componente di confronto di Contiene è un elenco di elementi JMP,
Contains( {"BARBARA ANN", "BETTY", "DAVID"}, "BARBARA")
restituirebbe anche un True, tuttavia restituisce un False, il che significa che esegue una corrispondenza assoluta.
Grazie per le ottime informazioni
Re: Convertire array in stringaAncora una volta, stupito dalla capacità di Jim di arrivare al nocciolo della questione. Due bei pezzi di codice qui meritano una spiegazione più lunga:
Cosa fa questo?
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
ref_file_1 è un riferimento alla tabella dati, "NOME" è il nome di una colonna sotto forma di stringa (letteralmente, "NAME", ma potrebbe essere in una variabile), e the colonna La funzione restituisce un riferimento di colonna. IL < message ottiene tutti i valori dalla colonna, inclusi i duplicati. IL matrice associativa la funzione crea un insieme di valori univoci e il < messaggio restituisce i valori univoci. (Ben fatto @29755 .)
e questo?
merged_file << select where(nrows(loc(name_key,:Name_final))>0);
IL < messaggio opera su ogni riga del file_unito , uno alla volta e seleziona le righe quando l'argomento è diverso da zero.
IL loc() funzione restituisce una matrice di indici. Cerca nell'elenco in nome_chiave per le occorrenze di :Name_final. La matrice risultante può avere zero o più righe, anche se in questo esempio avrà 0 o 1 riga perché le chiavi sono univoche. IL righe() funzione restituisce 0 o 1 che viene quindi confrontato >0 e rimane 0 o 1. Quindi le righe sono selezionate se :Name_final è nell'elenco di ref_file_1:NAME.
Alternativa:
E se ci fossero >1e6 nomi in name_key e >1e7 righe in merge_file? Come sarebbe la performance? La funzione loc cercherà molto. Confronterà le stringhe 1e13. Ti stancherai di aspettare. La soluzione per questo è usare l'array associativo in questo modo:
nameSet = associative array(column(ref_file_1, "NAME") << get values);
merged_file << select where(contains(nameSet, :Name_final));
Ora ci sono solo ricerche 1e7 in nameSet. Non sono gratuiti, ma sono molto più veloci rispetto al controllo sequenziale di 1e6 elementi. Immagino circa 20 confronti ciascuno (log2 (1e6)). Questo potrebbe anche essere più facile da seguire per il manutentore successivo.
(Non testato. Benvenute correzioni!)
Re: Convertire array in stringaPenso che questo ti darà quello che vuoi
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
merged_file << select where(nrows(loc(name_key,:Name_final))>0);