Spaltenvariable im IF-Ausdruck verwendenLiebe Community,
Unten verwende ich mehrere Variablen, die von einem Dialog gebracht werden:
- colSelect: die zu analysierende Spalte
- quantVal1 & quantVal2: Quantilwerte
Im folgenden Skript erstelle ich eine Spalte „Kategorien“, die dann tabelliert wird, um die Beträge für jedes Quantil zu erhalten.
Zwei Probleme:
- Das Ersetzen des hardcodedl-Spaltennamens durch eine Eval()-Methode funktioniert nicht
- Wie kann ich testen, ob die Spalte bereits vorhanden ist, und wenn ja, ihre Formel aktualisieren?
Dies würde es ermöglichen, meinen gesamten Analyseprozess mit neuen Spalten und Quantilen zu aktualisieren, ohne das Laden und Verarbeiten der Datentabelle von Grund auf neu starten zu müssen.
//Custom Quantiles amounts
dt << New Column( "Categories",
Numeric, "Continuous",
Format( "Best", 9 ),
Formula(
If( Eval( colSelect )/*:Total Time From CheckIn Collector To Exit*/ <= quantVal1,
1,
If( Eval( colSelect )/*:Total Time From CheckIn Collector To Exit*/ <= quantVal2,
2,
3
)
)
),
Set Property( "Value Order", {} ),
Set Property(
"Color Gradient",
{{"Green to Orange to Red", 4099, {{0, 227, 0}, {255, 255, 0}, {252, 11, 11}}, {0, 0.5, 1}}, Range( {1, 3, 1} )}
),
Color Cell by Value,
Set Display Width( 74 )
);Vielen Dank!
SkripterstellungBetreff: Spaltenvariable in IF-Ausdruck verwendenEin kleiner Nachteil dieses Codes: Die Variablen in der Formel werden zu einem späteren Zeitpunkt nicht mehr definiert.
Dies ist an den roten Wackeln im Formeleditor zu erkennen:

Die Folge: Wenn sich in Zukunft ein Wert in der Tabelle ändert, wird die Spalte nicht automatisch aktualisiert.
Ein robusterer Code kann mit einem Ansatz generiert werden, von dem ich gelernt habe @jthi :
Stellen NameExpr (Als Spalte()) Innerhalb Ausdruck() .
Dann sieht die Formel so aus:

und Spaltenwerte werden in Zukunft aktualisiert, wenn Eingabewerte aktualisiert werden 
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
colSelect ="age";
quantVal1 = 13;
quantVal2 = 16;
//Custom Quantiles amounts
Eval(Eval Expr(dt << New Column( "Categories",
Numeric, "Continuous",
Format( "Best", 9 ),
Formula(
If( Expr( NameExpr(As Column(dt, colSelect)) )/*:Total Time From CheckIn Collector To Exit*/ <= Expr(quantVal1),
1,
If( Expr( Name Expr(As Column(dt, colSelect)) )/*:Total Time From CheckIn Collector To Exit*/ <= Expr(quantVal2),
2,
3
)
)
),
Set Property( "Value Order", {} ),
Set Property(
"Color Gradient",
{{"Green to Orange to Red", 4099, {{0, 227, 0}, {255, 255, 0}, {252, 11, 11}}, {0, 0.5, 1}}, Range( {1, 3, 1} )}
),
Color Cell by Value,
Set Display Width( 74 )
)));
dt:age[12]=40;
Betreff: Spaltenvariable in IF-Ausdruck verwendenNochmals vielen Dank Byron,
Nachdem ich beide ausprobiert und einige der bereitgestellten Links gelesen hatte, war es schließlich eine Mischung aus beidem, die funktionierte: AsColumn()
Danke an alle!
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
colSelect = "age";
quantVal1 = 13;
quantVal2 = 16;
//Custom Quantiles amounts
Eval(Eval Expr(dt << New Column( "Categories",
Numeric, "Continuous",
Format( "Best", 9 ),
Formula(
If( AsColumn( colSelect )/*:age*/ <= quantVal1,
1,
If( AsColumn( colSelect )/*:age*/ <= quantVal2,
2,
3
)
)
),
Set Property( "Value Order", {} ),
Set Property(
"Color Gradient",
{{"Green to Orange to Red", 4099, {{0, 227, 0}, {255, 255, 0}, {252, 11, 11}}, {0, 0.5, 1}}, Range( {1, 3, 1} )}
),
Color Cell by Value,
Set Display Width( 74 )
)));
colList = dt << Get Column Names("String");
Show(Contains(colList, "Categories")); //will return indexBetreff: Spaltenvariable in IF-Ausdruck verwendenVielleicht schauen Sie sich auch diese beiden Argumente an:
Spalte()
Als Name()
Ihr Skript versucht möglicherweise, ColSelect als Textzeichenfolge und nicht als Spaltennamen zu analysieren
Betreff: Spaltenvariable in IF-Ausdruck verwendenVielen Dank Jarmo,
Ich habe Teillösungen in Ihrer Antwort.
Trotzdem funktioniert der colSelect-Trick nur mit einem bestimmten numerischen Wert, nicht mit einem Spaltennamen (vergessen zu erwähnen).
Dank Ihres Beispiels sehen Sie hier mehr, wie es aussehen würde (Expr (colSelect) funktioniert in diesem aktualisierten Kontext nicht):
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
colSelect = "age";
quantVal1 = 13;
quantVal2 = 16;
//Custom Quantiles amounts
Eval(Eval Expr(dt << New Column( "Categories",
Numeric, "Continuous",
Format( "Best", 9 ),
Formula(
If( /*Expr( colSelect )*/:age <= quantVal1,
1,
If( /*Expr( colSelect )*/:age <= quantVal2,
2,
3
)
)
),
Set Property( "Value Order", {} ),
Set Property(
"Color Gradient",
{{"Green to Orange to Red", 4099, {{0, 227, 0}, {255, 255, 0}, {252, 11, 11}}, {0, 0.5, 1}}, Range( {1, 3, 1} )}
),
Color Cell by Value,
Set Display Width( 74 )
)));
colList = dt << Get Column Names("String");
Show(Contains(colList, "Categories")); //will return index
Betreff: Spaltenvariable in IF-Ausdruck verwendenHallo Byron,
Die Show(colSelect) gibt eine einfache Zeichenfolge zurück, keine Liste (ich habe mich darum gekümmert, als ich die Dialog-Argumente übergeben habe):
colSelect = "Gesamtzeit vom Einchecken bis zum Verlassen";
Ich werde dieses PDF erkunden, dankeBetreff: Spaltenvariable in IF-Ausdruck verwendenda ColSelect aus einem Dialog kommt, kann es tatsächlich eine Liste mit einem Element sein.
Wenn Sie ColSelect auswerten, was wird zurückgegeben? wenn es {:colname} ist, dann ist es eine Liste mit einem Element
Versuchen Sie, ColSelect[1] auszuwerten, wenn es aus einer Liste stammt, wird :colname zurückgegeben.
In diesem Fall gibt eval() die Liste zurück.
schau dir auch Eval list() an
Es gibt ein PDF, das SUPER hilfreich ist, um Ausdrücke zu verstehen, die diesem Beitrag beigefügt sind.
Funktionen zur Behandlung von Ausdrücken: Teil I - Enträtseln von Expr(), NameExpr(), Eval(), ... Rätsel
Betreff: Spaltenvariable in IF-Ausdruck verwenden1. Guter Thread, wie man Werte in der Formel ersetzt:
Fügen Sie mit Eval Insert, Eval Expr, Parse und Substitute einen Ausdruck in einen anderen ein
Wenn Sie keine Formel benötigen, würde ich vorschlagen, << Set Each Value zu verwenden.
2. Sie können die Liste der Spaltennamen mit dt << Get Column Names("String") abrufen und Contains() verwenden, um nach Spalten in dieser Liste zu suchen
Das sollte funktionieren:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
colSelect = 1;
quantVal1 = 1;
quantVal2 = 2;
//Custom Quantiles amounts
Eval(Eval Expr(dt << New Column( "Categories",
Numeric, "Continuous",
Format( "Best", 9 ),
Formula(
If( Expr( colSelect )/*:Total Time From CheckIn Collector To Exit*/ <= Expr(quantVal1),
1,
If( Expr( colSelect )/*:Total Time From CheckIn Collector To Exit*/ <= Expr(quantVal2),
2,
3
)
)
),
Set Property( "Value Order", {} ),
Set Property(
"Color Gradient",
{{"Green to Orange to Red", 4099, {{0, 227, 0}, {255, 255, 0}, {252, 11, 11}}, {0, 0.5, 1}}, Range( {1, 3, 1} )}
),
Color Cell by Value,
Set Display Width( 74 )
)));
colList = dt << Get Column Names("String");
Show(Contains(colList, "Categories")); //will return index