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 sind Funktionen wie z V max , V Mittel , und V Quantil kann 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 mit dem Namen verrückt Dabei wird ein Vektor als Eingabe verwendet und die mittlere absolute Abweichung (der Median der absoluten Differenzen vom Median der Daten) zurückgegeben. Zum Beispiel, verrückt ([1,2,3,1000]) gibt 1 zurück. Wenn es eine gerade Anzahl von Beobachtungen gibt, nehmen Sie den Mittelwert in der Mitte, um den Median zu berechnen.
- Schreiben Sie eine Funktion getrimmten Mittelwert ( vecIn , pctLo , pctHi ), der einen Vektor ( vecIn ) und ein Wert zwischen 0 und 0,5 entsprechend dem Prozentsatz der Beobachtungen unten ( pctLo ) und darüber ( pctHi ) der Mittelwert, der entfernt wird, 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 ), das eine Liste von Zeichenfolgen ( listIn ) und eine Zeichenfolge ( valueString ) und gibt eine Liste von Matrixwerten zurück, wobei jedes Element der Matrix einer Startposition von entspricht valueString im J Artikel von listIn (d. h. ein Artikel von listIn kann enthalten valueString mehr als einmal). 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 ) und wendet die Funktion an fn mit Argumenten argList dazu. 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).
Wertung: 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 23:59 Uhr Eastern US Time am Montag, 17. August .
11. August 2020: Es gab ein wenig Verwirrung über einige Aspekte der Herausforderung. Mal sehen, ob ich die Sache klären kann:
- Für getrimmten Mittelwert , pctLo Und pctHi sind gebrochene Werte, die unten durch 0 und oben durch 0,5 begrenzt sind. Wenn zum Beispiel pctLo = 0,23, dann werden die 23 % der Werte aus dem unteren Ende entfernt.
- Für listContains , Wenn listIn = {"ABCD", "DEFG", "GHIJ"} und valueString = „D“, dann wird [4,1,.] zurückgegeben.
- Für applyFunction , beide listIn Und argList sind Argumente dafür fn . Der Hauptunterschied besteht darin listIn wird nie leer sein, aber argList kann leer sein. Zum Beispiel, wenn listIn = {"ABCD","DEFG","GHIJ"} und fn = Enthält , Dann argList sollte eine Liste sein, die mindestens eine Teilzeichenfolge enthält, nach der gesucht werden soll. Wenn fn = Länge , Jedoch, argList wäre leer. In Fällen, in denen fn auf die einzelnen Elemente angewendet werden kann, tun Sie dies. Zum Beispiel, wenn fn = Verkohlen Anstatt die zitierte Liste zurückzugeben, zitieren Sie die einzelnen Elemente der Liste.
Ich hoffe, das macht die Sache klarer. Wenn nicht, lassen Sie es mich bitte wissen.

Die Herausforderung dieses Monats bekommt Meta.
JMP-BlogBetreff: 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.