<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ich werde häufig gefragt, wie man eine Formel per Skript erstellt (die gleiche Formel auf mehrere Spalten anwenden und dabei etwas über die Referenzspalte in der Formel verwenden). Dies ist normalerweise auch ein Einstiegspunkt für Leute, die mit dem Schreiben von Skripten beginnen, also Anfänger sind.
Kürzlich habe ich im regulären Diskussionsbereich eine Frage gestellt, um sowohl meinen Kunden zur Teilnahme zu bewegen (was nicht der Fall war) als auch einen Expertenrat (jemanden, der dies liest) einzuholen. Ich würde wirklich gerne eine fundierte Antwort finden, auf die ich die Leute hinweisen kann, wenn diese Frage auftaucht. Ist die vorgeschlagene Antwort beispielsweise wirklich die beste Lösung, 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 finden Sie hier:
Der beste Weg, eine Spaltenformel in viele Spalten zu schreiben?
Danke schön!
Als Fortsetzung zum Vorherigen: Sie werden feststellen, dass ich die Funktion :Name() für Spaltennamen verwende. Dies hilft, Probleme zu vermeiden, die durch interessante Zeichen in Spaltennamen entstehen. Nicht immer nötig, aber auch hier: kugelsicher.
Im Anschluss an das, was Don gesagt hat, gehe ich oft noch einen Schritt weiter und verwende Eval(Parse(Substitute())).
Dabei wird der Code tatsächlich dynamisch geschrieben. Es ist zwar etwas unelegant, aber nahezu kugelsicher. Dieses Konstrukt ist nicht immer das effizienteste (aufgrund der Zeichenersetzungen), aber es ist dasjenige, das erfolgreich ist, wenn alle anderen Tricks fehlschlagen, daher ist es gut, darüber Bescheid zu wissen. Der größte Nachteil besteht darin, dass Sie aufgrund des Zitats die Farbcodierung nicht sehen können:
Namen standardmäßig hier ( 1 ) ;
dt = offen ( „$Sample_Data/football.jmp“ ) ;
codeFrag = „\[
Neue Spalte( "_colName_ Rang vom Mittelwert",
Numerisch,
„Kontinuierlich“,
Format( „Best“, 12 ),
Formel( Col Rank( Abs( Col Mean( :Name( "_colName_" )) - :Name( "_colName_" ) ) ) )
)
]\" ;
colList = dt << getcolumnnames ( Zeichenfolge ) ;
für ( ich = 1 , ich <= nitems ( collist ) , ich ++,
Wenn ( Spalte ( dt , colList [ ich ]) << Modellierungstyp abrufen == „Kontinuierlich“ ,
evalu ( analysieren ( Ersatz ( codeFrag , „_colName_“ , colList [ ich ])))
)
) ;
Wenn Sie die fehlende Farbcodierung stört, können Sie sie beibehalten, indem Sie die Zeichenfolge wie unten in ein char(nameexpr())-Konstrukt einschließen. Dies erhöht die Komplexität, kann sich jedoch beim Schreiben des Codes für Debugging-Zwecke lohnen. Sobald es funktioniert, können Sie jederzeit den Teil char(nameexpr()) entfernen und mit „\[ ]\“ in Anführungszeichen setzen.
Fazit: Dies wird keinen Schönheitswettbewerb gewinnen, aber wenn Sie die Zeichenfolge selbst schreiben, analysieren und auswerten, erhalten Sie, was Sie suchen. Bewahren Sie dies in Ihrer Gesäßtasche auf, wenn Eval(EvalExpr( ...... Expr() .... )) schlägt fehl und Sie können nicht herausfinden (oder haben keine Zeit, es herauszufinden, oder es ist Ihnen egal), warum.
Namen standardmäßig hier ( 1 ) ;
dt = offen ( „$Sample_Data/football.jmp“ ) ;
codeFrag = verkohlen ( Nameexpr (
Neue Spalte ( „_colName_ Rang vom Mittelwert“ ,
Numerisch ,
„Kontinuierlich“ ,
Format ( "Am besten" , 12 ) ,
Formel ( Oberstrang ( Abs ( Col Mean ( : Name ( „_colName_“ )) - : Name ( „_colName_“ ) ) ) )
)
)) ;
colList = dt << getcolumnnames ( Zeichenfolge ) ;
für ( ich = 1 , ich <= nitems ( collist ) , ich ++,
Wenn ( Spalte ( dt , colList [ ich ]) << Modellierungstyp abrufen == „Kontinuierlich“ ,
evalu ( analysieren ( Ersatz ( codeFrag , „_colName_“ , colList [ ich ])))
)
) ;
Prost,
Brady
Laura,
Ich denke, die im Forum gegebene Antwort ist ein solider Ansatz, der den Code nicht mehr kompliziert als nötig ist. Ich denke, dass die Verwendung von Expr und Name Expr in dieser Situation unvermeidlich ist. Als nächsten Schritt könnten Sie erwägen, die Formel aus der Schleife zu entfernen, um den Code allgemeiner zu gestalten. Auf diese Weise können Sie eine Funktion erstellen, die Formeln als Argument akzeptiert (siehe beigefügte JSL). Es gibt wahrscheinlich eine einfachere Möglichkeit, dies zu tun, aber ich bin es sehr gewohnt, Substitute zu verwenden (und es ist äußerst robust). Ich bin mir nicht sicher, warum der Teil [Row()] benötigt wird, aber er ist für alle Fälle gedacht, in denen Sie auf eine Spalte verweisen, außer innerhalb einer statistischen Spaltenfunktion. Ich hoffe, das gibt einen Einblick.
Don