Une des choses que j'ai oublié de mentionner dans mon message précédent était que la méthode de recherche matricielle s'adapte mal aux données de caractères. Le code dans Définir les opérations à l'aide de matrices.JSL contient la fonction chaîne de carte qui convertit une chaîne de caractères composée de lettres minuscules en valeur numérique. Cette cartographie ralentit considérablement les choses. Dans un article connexe , @Adi-B interrogé sur l'exécution d'une recherche et d'un remplacement sur une colonne de table de données. Encore une fois, nous avons affaire à un mappage d’une chaîne vers autre chose (dans ce cas, une autre chaîne).
Cela nous amène au défi de ce mois-ci : quel est le moyen le plus rapide de mapper un ensemble de valeurs à un nouvel ensemble de valeurs ?
- Pour les données continues, il est souvent judicieux de regrouper les valeurs en quantiles, les déciles (c'est-à-dire 10 groupes) étant probablement les plus courants. Écrire une fonction, groupequantile( inVec , quantitatif ) , qui prend un vecteur et un entier positif supérieur à un et renvoie le groupe quantile auquel appartiennent les valeurs d'entrée. Par exemple, si
inVec = [1,2,3,4,5,6,7,8,9] et quantitatif = 3
la fonction reviendrait [1,1,1,2,2,2,3,3,3] .
Vous devrez décider comment traiter les valeurs qui chevauchent les limites d'un groupe quantile, en particulier s'il y a des doublons.
- Lorsqu’il s’agit de données catégorielles nivelées, il est souvent judicieux de regrouper les niveaux avec de faibles nombres en un seul niveau. Créer une fonction globalLowCounts( dans la liste ) qui prend une liste d'entrée de valeurs catégorielles et renvoie une liste qui mappe les valeurs avec des comptes élevés à elles-mêmes et les valeurs avec des comptes faibles dans un seul nouveau groupe. Comment déterminer la valeur seuil pour les faibles comptes fait partie du défi.
- Se référant à le post mentionné ci-dessus , créez une fonction trouver et remplacer( dans la liste , aaCarte ) qui prend une liste de chaînes et, pour chaque élément, effectue un mappage en utilisant un tableau associatif fourni comme deuxième argument, d'une sous-chaîne à une nouvelle sous-chaîne. Ce mappage peut être un à un ou plusieurs à un.
- (Crédit supplémentaire) La recherche dans une liste de chaînes de caractères peut-elle être plus rapide que Lieu ? Le but de chaîne de carte était de convertir une chaîne en nombre donc Local trié , qui utilise une recherche binaire, pourrait être utilisé. Local trié est considérablement plus rapide que Lieu . Essayez de créer une fonction, locSortedString( liste de chaînes , inString ) qui trouve la position de la chaîne inString à partir de la liste triée de chaînes liste de chaînes . Il est difficile d'imaginer créer quelque chose plus rapidement que Lieu sans connaissance a priori des valeurs de chaîne possibles qui peuvent survenir. En gardant cela à l'esprit, supposons que toutes les chaînes proviendront de la liste de mots que nous avons utilisée dans Défi 1 . Il est joint ci-dessous.
Bonne chance!