Una delle cose che ho dimenticato di menzionare il mio post precedente era che il metodo di ricerca della matrice si adatta male ai dati dei caratteri. Il codice dentro Impostare le operazioni utilizzando matrici.JSL contiene la funzione mapString che converte una stringa di caratteri composta da lettere minuscole in un valore numerico. Questa mappatura rallenta notevolmente le cose. In un post correlato , @Adi-B chiesto informazioni sull'esecuzione di una ricerca e sostituzione su una colonna della tabella dati. Ancora una volta, abbiamo a che fare con una mappatura da una stringa a qualcos'altro (in questo caso, un'altra stringa).
Ciò porta alla sfida di questo mese: qual è il modo più veloce per mappare un insieme di valori su un nuovo insieme di valori?
- Per i dati continui, spesso ha senso raggruppare i valori in quantili, dove i decili (cioè 10 gruppi) sono probabilmente i più comuni. Scrivi una funzione, quantileGroup( inVec , quantitativo ) , che prende un vettore e un intero positivo maggiore di uno e restituisce il gruppo quantile a cui appartengono i valori di input. Ad esempio, se
inVec = [1,2,3,4,5,6,7,8,9] E quantitativo = 3
la funzione ritornerebbe [1,1,1,2,2,2,3,3,3] .
Dovrai decidere come gestire i valori che si trovano a cavallo del confine di un gruppo quantile, in particolare se sono presenti duplicati.
- Quando si hanno a che fare con dati categorici a più livelli, spesso ha senso aggregare livelli con conteggi bassi in un unico livello. Crea una funzione aggregaLowCounts( inList ) che accetta un elenco di input di valori categoriali e restituisce un elenco che associa i valori con conteggi elevati a se stessi e i valori con conteggi bassi in un unico nuovo gruppo. Come determinare il valore limite per i conteggi bassi è parte della sfida.
- Riferito a il post citato sopra , creare una funzione trova e sostituisci( inList , aaMap ) che prende un elenco di stringhe e, per ciascun elemento, esegue una mappatura utilizzando un array associativo fornito come secondo argomento, da una sottostringa a una nuova sottostringa. Questa mappatura può essere uno-a-uno o molti-a-uno.
- (Credito extra) La ricerca in un elenco di stringhe di caratteri può essere resa più veloce di Loc ? Lo scopo di mapString era convertire una stringa in un numero così Posizione ordinata , che utilizza una ricerca binaria, potrebbe essere utilizzato. Posizione ordinata è notevolmente più veloce di Loc . Prova a creare una funzione, locStringaordinata( stringList , inString ) che trova la posizione della stringa inString dall'elenco ordinato di stringhe stringList . È difficile immaginare di creare qualcosa più velocemente di Loc senza una conoscenza a priori dei possibili valori di stringa che possono verificarsi. Con questo in mente, supponiamo che tutte le stringhe provengano dall'elenco di parole che abbiamo utilizzato Sfida 1 . È allegato qui sotto.
Buona fortuna!