Défi 5
Travailler avec des matrices est à la fois pratique et rapide. De nombreuses fonctions qui fonctionnent sur une seule valeur peuvent également être appliquées à une matrice entière. De plus, des fonctions telles que V Max , V Mean et V Quantile peuvent être appliquées à une fonction de la matrice (colonnes, dans ces situations). Le défi de ce mois-ci vise à passer au niveau supérieur. Nous chercherons à étendre cette fonctionnalité aux fonctions qui ne sont pas disponibles en JSL, et à le faire à la fois pour les matrices et les listes.
- Écrivez une fonction nommée mad qui prend un vecteur comme entrée et renvoie l'écart absolu médian (la médiane des différences absolues par rapport à la médiane des données). Par exemple, mad ([1,2,3,1000]) renvoie 1. S'il y a un nombre pair d'observations, prenez la valeur moyenne au milieu pour calculer la médiane.
- Écrivez une fonction trimmedMean ( vecIn , pctLo , pctHi ) qui prend un vecteur ( vecIn ) et une valeur comprise entre 0 et 0,5 correspondant au pourcentage d'observations en dessous ( pctLo ) et au-dessus ( pctHi ) de la moyenne qui sont supprimées avant que la moyenne ne soit calculée. Le pourcentage de valeurs tronquées doit être le plus grand nombre qui ne dépasse pas le pourcentage saisi.
- Écrivez une fonction listContains ( listIn , valueString ) qui prend une liste de chaînes ( listIn ) et une chaîne ( valueString ) et renvoie une liste de valeurs matricielles où chaque élément de la matrice correspond à une position de départ de valueString dans le j ème élément de listIn (c'est-à-dire qu'un élément de listIn peut contenir valueString plusieurs fois). Renvoie la valeur manquante si l'élément ne contient pas la chaîne.
- Écrivez une fonction applyFunction ( listIn , fn , argList ) qui prend une liste d'entrée ( listIn ) et lui applique la fonction fn avec les arguments argList . Supposons que la liste ne contienne que des nombres ou des chaînes. La fonction doit fonctionner à la fois pour les fonctions intégrées et fournies par l'utilisateur. Il peut renvoyer une valeur unique, une matrice ou une liste de valeurs en fonction de la fonction d'entrée. Pour plus de simplicité, supposons que toute fonction fournie à applyFunction n'aura besoin d'opérer que sur un caractère, une chaîne, des nombres, une matrice ou une liste (limitée aux éléments de caractère, de chaîne, de nombre, de matrice ou de liste).
Notation : deux points pour les éléments 1 et 2, six points pour les éléments 3 et 4. Quatre points supplémentaires si vous pouvez écrire l'élément 3 ou 4 sans utiliser de boucle (de quelque sorte que ce soit) ou de tableau de données.
La date limite d'inscription est fixée au lundi 17 août à 23 h 59, heure de l'Est des États-Unis .
11 août 2020 : Il y a eu un peu de confusion sur certains aspects du défi. Voyons si je peux clarifier les choses :
- Pour trimmedMean , pctLo et pctHi sont des valeurs frationnelles limitées en dessous de 0 et au-dessus par 0,5. Si, par exemple, pctLo = 0,23, alors les 23 % des valeurs de la queue inférieure sont supprimés.
- Pour listContains , si listIn = {"ABCD","DEFG", "GHIJ"} et valueString = "D", alors [4,1,.] est renvoyé.
- Pour applyFunction , listIn et argList sont tous deux des arguments de fn . La principale différence est que listIn ne sera jamais vide, mais argList peut être vide. Par exemple, si listIn = {"ABCD","DEFG","GHIJ"} et fn = Contains , alors argList doit être une liste contenant au moins une sous-chaîne à rechercher. Cependant, si fn = Longueur , argList serait vide. Dans les cas où fn peut être appliqué aux éléments individuels, faites-le. Par exemple, si fn = Char , plutôt que de renvoyer la liste citée, citez les éléments individuels de la liste.
J'espère que cela rend les choses plus claires. Si ce n'est pas le cas, faites-le-moi savoir.

Le défi de ce mois-ci devient méta.
Automatisation et scriptsRe : Défi 5Désolé tout le monde. Les choses ont été très chargées pour moi et ce défi s'est avéré plus délicat que prévu. J'ai presque terminé la rédaction et je devrais avoir quelque chose d'ici la fin de la semaine. Espérons qu’un nouveau défi peu de temps après.
Re : Défi 5des nouvelles à ce sujet?
Re : Défi 5Merci!
Re : Défi 5@David_Burnham Je pensais au 2ème.
Re : Défi 5Juste le temps de poser une dernière question.ArgList - est une liste d'arguments ou une véritable liste JMP :
applyFunction(inList,fn,a,b,c,flag)
ou
applyFunction(inList,fn,{a,b,c},flag)
Si je n'ai pas de vos nouvelles, je suppose que cela peut être le cas non plus !
Re : Défi 5Pas de problème! Cela aide à élucider les problèmes liés à cette tentative. Ajoutons un indicateur comme dernier argument à applyFunction pour indiquer s'il doit être appliqué par liste ou par élément.
appliquerFonction ( dans la liste , fn , argListe , drapeau )
Re : Défi 5C’est parfaitement clair et je suis heureux de travailler avec ces hypothèses.
Cependant (désolé !) je pense immédiatement à un contre-scénario : les fonctions JMP Concaténer des éléments et des contenus traiter des listes entières plutôt que des éléments individuels.Et alors que je voudrais Somme pour postuler à toute la liste, je voudrais Rond à appliquer aux éléments.(Pourrions-nous ne pas avoir un paramètre flag pour indiquer si la fonction fonctionne au niveau de la liste ou au niveau des éléments individuels).
Désolé encore, j'ai l'impression d'être pénible.
Re : Défi 5Merci David,
Utilisons les hypothèses suivantes :
- fn est une chaîne.
- listeDans est une liste composée entièrement de nombres ou entièrement de chaînes. Si les chiffres, fn effectuera son opération sur l’ensemble du vecteur de valeurs d’entrée. S'il s'agit d'un caractère, il effectuera l'opération sur les éléments individuels.
- L'ordre dans lequel les arguments apparaissent dans argListe est le même ordre à utiliser dans fn .
J'espère que cela rend les choses un peu claires. Encore une fois, si ce n'est pas le cas, faites-le-moi savoir.
Re : Défi 5Merci pour les précisions Don.Pour applyFunction, est fn exprimé sous forme de chaîne ?Si fn peut être n'importe quelle fonction, comment savoir si elle peut ou non s'appliquer à des éléments individuels ? - applyFunction voit simplement un nom de fonction comme paramètre d'entrée, il n'a aucune connaissance de ce que la fonction est capable de faire ?Et si ListeDans est une liste de nombres, il serait alors logique de résumer la liste entière, mais alternativement, chaque élément pourrait être une liste, auquel cas il pourrait être judicieux de renvoyer une liste de sommes.