<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ich habe häufig die Frage, wie man eine Formel schreibt (dieselbe Formel auf mehrere Spalten anwenden, wobei etwas über die Referenzspalte in der Formel verwendet wird). Dies ist normalerweise ein Einstiegspunkt für Leute, die auch mit dem Schreiben von Skripten beginnen möchten, also sind sie Anfänger.
Ich habe kürzlich eine Frage im regulären Diskussionsbereich veröffentlicht, in der versucht wurde, meinen Kunden zur Teilnahme zu bewegen (dies war nicht der Fall) und einige Expertenratschläge (jeder, der dies liest). Ich würde wirklich gerne eine solide Antwort generieren, auf die ich die Leute hinweisen könnte, wenn diese Frage auftaucht. Ist die vorgeschlagene Antwort beispielsweise wirklich der beste Weg, wenn Sie mehr als 1000 Spalten usw. haben?
Jede Hilfe hierzu wäre dankbar. Oder ein Blogeintrag. Oder darauf hinweisen, dass dies woanders behandelt wurde?
Die regelmäßige Diskussion ist hier:
Der beste Weg, eine Spaltenformel in viele Spalten zu schreiben?
Vielen Dank!
Als Folge des vorherigen: Sie werden feststellen, dass ich die Funktion: Name () für Spaltennamen verwende. Dies hilft, Probleme zu vermeiden, die sich aus interessanten Zeichen in Spaltennamen ergeben. Nicht immer benötigt, aber wieder kugelsicher.
Nach dem, was Don gesagt hat, gehe ich oft einen Schritt weiter und benutze Eval (Parse (Substitute ())).
Dies bedeutet, dass der Code tatsächlich dynamisch geschrieben wird. Es ist zwar etwas unelegant, aber nahezu kugelsicher. Dieses Konstrukt ist nicht immer das effizienteste (aufgrund der Zeichensubstitutionen), aber es ist dasjenige, das erfolgreich ist, wenn alle anderen Tricks fehlschlagen. Es ist also gut zu wissen. Der größte Nachteil ist, dass Sie die Farbcodierung aufgrund des Zitats nicht sehen können:
Namen Standard hier ( 1 ) ;;
dt = öffnen ( "$ Sample_Data /ccer.jmp" ) ;;
codeFrag = "\ [
Neue Spalte ("_colName_ Rang vom Mittelwert",
Numerisch,
"Kontinuierlich",
Format ("Best", 12),
Formel (Col Rang (Abs (Col Mittelwert (: Name ("_colName_")) -: Name ("_colName_")))
)
] \ " ;;
colList = dt << getcolumnnames ( Zeichenfolge ) ;;
zum ( ich = 1 , ich <= nitems ( Kollist ) , ich ++,
wenn ( Säule ( dt , colList [ ich ]) << Modellierungstyp abrufen == "Kontinuierlich" ,
eval ( analysieren ( Ersatz ( codeFrag , "_colName_" , colList [ ich ])))
)
) ;;
Wenn Sie das Fehlen einer Farbcodierung stört, können Sie diese beibehalten, indem Sie die Zeichenfolge wie unten beschrieben in ein char-Konstrukt (nameexpr ()) einschließen. Dies erhöht die Komplexität, aber es kann sich lohnen, den Code für Debugging-Zwecke zu schreiben. Sobald er funktioniert, können Sie das Zeichen (nameexpr ()) jederzeit entfernen und mit "\ [] \" in Anführungszeichen setzen.
Fazit: Dies wird keinen Schönheitswettbewerb gewinnen, aber wenn Sie den String selbst schreiben, analysieren und bewerten, werden Sie das bekommen, wonach Sie suchen. Bewahren Sie dies in Ihrer Gesäßtasche auf, wenn Eval (EvalExpr (...... Ausdruck () ....)) schlägt fehl und Sie können nicht herausfinden (oder haben nicht die Zeit, herauszufinden, oder es ist Ihnen egal), warum.
Namen Standard hier ( 1 ) ;;
dt = öffnen ( "$ Sample_Data /ccer.jmp" ) ;;
codeFrag = verkohlen ( nameexpr (
Neue Spalte ( "_colName_ Rang vom Mittelwert" ,
Numerisch ,
"Kontinuierlich" ,
Format ( "Beste" , 12 ) ,
Formel ( Col Rank ( Abs ( Col Mean ( :: Name ( "_colName_" )) - - :: Name ( "_colName_" ) ) ) )
)
)) ;;
colList = dt << getcolumnnames ( Zeichenfolge ) ;;
zum ( ich = 1 , ich <= nitems ( Kollist ) , ich ++,
wenn ( Säule ( dt , colList [ ich ]) << Modellierungstyp abrufen == "Kontinuierlich" ,
eval ( analysieren ( Ersatz ( codeFrag , "_colName_" , colList [ ich ])))
)
) ;;
Prost,
Brady
Laura,
Ich denke, die Antwort im Forum ist ein solider Ansatz, der den Code nicht mehr kompliziert als nötig. Ich denke, die Verwendung von Expr und Name Expr ist in dieser Situation unvermeidlich. Als nächsten Schritt können Sie die Formel aus der Schleife entfernen, um den Code allgemeiner zu gestalten. Auf diese Weise können Sie eine Funktion erstellen, die Formeln als Argument verwendet (siehe angehängte JSL). Es gibt wahrscheinlich einen einfacheren Weg, dies zu tun, aber ich bin es so gewohnt, Substitute zu verwenden (und es ist extrem robust). Ich bin mir nicht sicher, warum der Teil [Row ()] benötigt wird, aber er gilt immer dann, wenn Sie auf eine Spalte verweisen, außer innerhalb einer statistischen Spaltenfunktion. Hoffe das gibt einen Einblick.
Don