Herausforderung 5
Das Arbeiten mit Matrizen ist komfortabel und schnell. Viele Funktionen, die auf einen einzelnen Wert wirken, können auch auf eine ganze Matrix angewendet werden. Darüber hinaus können Funktionen wie V Max , V Mean und V Quantile auf eine Funktion der Matrix (in diesen Situationen Spalten) angewendet werden. Die Herausforderung dieses Monats zielt darauf ab, dies auf die nächste Stufe zu heben. Wir werden versuchen, diese Funktionalität auf Funktionen zu erweitern, die in JSL nicht verfügbar sind, und zwar sowohl für Matrizen als auch für Listen.
- Schreiben Sie eine Funktion namens mad , die einen Vektor als Eingabe verwendet und die mittlere absolute Abweichung (den Median der absoluten Differenzen vom Median der Daten) zurückgibt. Mad ([1,2,3,1000]) gibt beispielsweise 1 zurück. Wenn es eine gerade Anzahl von Beobachtungen gibt, verwenden Sie den Durchschnittswert in der Mitte, um den Median zu berechnen.
- Schreiben Sie eine Funktion trimmedMean ( vecIn , pctLo , pctHi ), die einen Vektor ( vecIn ) und einen Wert zwischen 0 und 0,5 annimmt, entsprechend dem Prozentsatz der Beobachtungen unterhalb ( pctLo ) und oberhalb ( pctHi ) des Mittelwerts, die entfernt werden, bevor der Mittelwert berechnet wird. Der Prozentsatz der gekürzten Werte sollte der größte Wert sein, der den Eingabeprozentsatz nicht überschreitet.
- Schreiben Sie eine Funktion listContains ( listIn , valueString ), die eine Liste von Strings ( listIn ) und einen String ( valueString ) entgegennimmt und eine Liste von Matrixwerten zurückgibt, wobei jedes Element der Matrix einer Startposition von valueString im j- ten Element von entspricht listIn (d. h. ein Element von listIn kann valueString mehr als einmal enthalten). Gibt den fehlenden Wert zurück, wenn das Element die Zeichenfolge nicht enthält.
- Schreiben Sie eine Funktion applyFunction ( listIn , fn , argList ), die eine Eingabeliste ( listIn ) nimmt und die Funktion fn mit den Argumenten argList darauf anwendet. Gehen Sie davon aus, dass die Liste nur Zahlen oder Zeichenfolgen enthält. Die Funktion sollte sowohl für integrierte als auch vom Benutzer bereitgestellte Funktionen funktionieren. Abhängig von der Eingabefunktion kann es einen einzelnen Wert, eine Matrix oder eine Werteliste zurückgeben. Nehmen Sie der Einfachheit halber an, dass jede an applyFunction bereitgestellte Funktion nur mit einem Zeichen, einer Zeichenfolge, Zahlen, einer Matrix oder einer Liste arbeiten muss (beschränkt auf Zeichen, Zeichenfolgen, Zahlen, Matrix- oder Listenelemente).
Bewertung: Zwei Punkte für die Punkte 1 und 2, sechs Punkte für die Punkte 3 und 4. Vier zusätzliche Punkte, wenn Sie Punkt 3 oder 4 schreiben können, ohne eine Schleife (jeglicher Art) oder eine Datentabelle zu verwenden.
Einsendeschluss ist Montag, der 17. August, 23:59 Uhr Eastern US Time .
11. August 2020: Über einige Aspekte der Herausforderung herrschte etwas Verwirrung. Mal sehen, ob ich die Sache klären kann:
- Für trimmedMean sind pctLo und pctHi gebrochene Werte, die unten durch 0 und oben durch 0,5 begrenzt sind. Wenn beispielsweise pctLo = 0,23, werden die 23 % der Werte aus dem unteren Ende entfernt.
- Wenn für listContains listIn = {"ABCD", "DEFG", "GHIJ"} und valueString = "D" gilt, wird [4,1,.] zurückgegeben.
- Für applyFunction sind sowohl listIn als auch argList Argumente für fn . Der Hauptunterschied besteht darin, dass listIn nie leer sein wird, argList jedoch leer sein kann. Wenn beispielsweise listIn = {"ABCD","DEFG","GHIJ"} und fn = Contains , dann sollte argList eine Liste sein, die mindestens eine zu suchende Teilzeichenfolge enthält. Wenn fn jedoch = Length , wäre argList leer. In Fällen, in denen fn auf die einzelnen Elemente angewendet werden kann, tun Sie dies. Wenn beispielsweise fn = Char , setzen Sie die einzelnen Elemente der Liste in Anführungszeichen, anstatt die in Anführungszeichen gesetzte Liste zurückzugeben.
Ich hoffe, das macht die Sache klarer. Wenn nicht, lassen Sie es mich bitte wissen.

Die Herausforderung dieses Monats bekommt Meta.
Automatisierung und SkripterstellungBetreff: Herausforderung 5Tut mir leid, alle zusammen. Es war wirklich viel los für mich und diese Herausforderung erwies sich als schwieriger, als ich erwartet hatte. Ich bin mit dem Aufschreiben fast fertig und sollte am Ende der Woche etwas haben. Hoffentlich bald eine neue Herausforderung.
Betreff: Herausforderung 5Gibt es Neuigkeiten zu diesem Thema?
Betreff: Herausforderung 5Danke!
Betreff: Herausforderung 5@David_Burnham Ich ging vom 2. aus.
Betreff: Herausforderung 5Es ist gerade an der Zeit, vielleicht noch eine letzte Frage zu stellen.ArgList – ist eine Liste von Argumenten oder eine tatsächliche JMP-Liste:
applyFunction(inList,fn,a,b,c,flag)
oder
applyFunction(inList,fn,{a,b,c},flag)
Wenn ich nichts von Ihnen höre, gehe ich davon aus, dass das auch der Fall sein kann!
Betreff: Herausforderung 5Keine Probleme! Dies hilft dabei, die Probleme zu klären, die bei diesem Versuch auftreten. Fügen wir als letztes Argument zu applyFunction ein Flag hinzu, um anzugeben, ob es listenweise oder elementweise angewendet werden soll.
applyFunction ( inListe , fn , argList , Flagge )
Betreff: Herausforderung 5Das ist völlig klar und ich arbeite gerne mit diesen Annahmen.
Allerdings fällt mir (sorry!) sofort ein Gegenszenario ein: die JMP-Funktionen Concat-Elemente und Enthält Verarbeiten Sie ganze Listen statt einzelner Elemente.Und obwohl ich es gerne hätte Summe auf die gesamte Liste anwenden möchte ich Runden auf Elemente anzuwenden.(Könnten wir nicht einen Flag-Parameter haben, der angibt, ob die Funktion auf Listenebene oder auf der Ebene einzelner Elemente arbeitet?)
Tut mir noch einmal Leid, ich habe das Gefühl, dass ich lästig bin.
Betreff: Herausforderung 5Danke David,
Gehen wir von folgenden Annahmen aus:
- fn ist eine Zeichenfolge.
- listIn ist eine Liste, die vollständig aus Zahlen oder vollständig aus Zeichenfolgen besteht. Wenn Zahlen, fn führt seine Operation am gesamten Vektor der Eingabewerte durch. Wenn es sich um ein Zeichen handelt, wird die Operation an den einzelnen Elementen ausgeführt.
- Die Reihenfolge, in der die Argumente erscheinen argList ist die gleiche Reihenfolge, in der verwendet werden soll fn .
Hoffentlich macht das die Sache etwas klarer. Wenn nicht, lassen Sie es mich bitte noch einmal wissen.
Betreff: Herausforderung 5Danke für die Klarstellungen, Don.Für applyFunction ist fn als String ausgedrückt?Wenn fn kann jede Funktion sein, woher wissen wir, ob sie auf einzelne Elemente angewendet werden kann oder nicht? - applyFunction sieht einen Funktionsnamen nur als Eingabeparameter und weiß nicht, wozu die Funktion in der Lage ist?Und wenn ListIn eine Liste von Zahlen ist, wäre es sinnvoll, die gesamte Liste zu summieren. Alternativ könnte aber auch jedes Element eine Liste sein. In diesem Fall könnte es sinnvoll sein, eine Liste von Summen zurückzugeben.