Verwenden Sie eine Spaltenvariable im IF-AusdruckLiebe Community,
Im Folgenden verwende ich mehrere Variablen, die von einem Dialog bereitgestellt werden:
- colSelect: die zu analysierende Spalte
- quantVal1 & quantVal2: Quantilwerte
Im folgenden Teil des Skripts erstelle ich eine Spalte „Kategorien“, die dann tabellarisch dargestellt wird, um Beträge für jedes Quantil zu erhalten.
Zwei Probleme:
- Das Ersetzen des hartcodierten 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 )
);Danke!
Erweiterte statistische ModellierungAutomatisierung und SkripterstellungInhaltsorganisationDatenzugriffDatenmischung und -bereinigungDatenexploration und -visualisierungVersuchsplanungMassenanpassungBetreff: Spaltenvariable im 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 Wackelbewegungen im Formeleditor zu erkennen:

Das Ergebnis: Wenn sich in der Zukunft ein Wert in der Tabelle ändert, wird die Spalte nicht automatisch aktualisiert.
Mit einem Ansatz, von dem ich gelernt habe, kann ein robusterer Code generiert werden @jthi :
Setzen NameExpr(As Column()) innen 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 im IF-Ausdruck verwendenNochmals vielen Dank Byron,
Nachdem ich beides ausprobiert und einige der bereitgestellten Links gelesen hatte, war es schließlich eine Mischung aus beidem, die funktionierte: AsColumn()
Vielen Dank 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 im IF-Ausdruck verwendenSchauen Sie sich vielleicht auch diese beiden Argumente an:
Spalte()
Als name()
Ihr Skript versucht möglicherweise, ColSelect als Textzeichenfolge und nicht als Spaltennamen zu analysieren
Betreff: Spaltenvariable im IF-Ausdruck verwendenVielen Dank Jarmo,
Ich habe Teillösungen in Ihrer Antwort.
Dennoch funktioniert der colSelect-Trick nur mit einem bestimmten numerischen Wert, nicht mit einem Spaltennamen (ich habe vergessen zu erwähnen).
Dank Ihres Beispiels sehen Sie hier, 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 im IF-Ausdruck verwendenHallo Byron,
Die Show(colSelect) gibt einen einfachen String zurück, keine Liste (darauf habe ich bei der Übergabe der Dialog-Argumente geachtet):
colSelect = "Gesamtzeit vom Einchecken bis zum Verlassen";
Ich werde mir dieses PDF ansehen, DankeBetreff: Spaltenvariable im IF-Ausdruck verwendenDa ColSelect aus einem Dialog stammt, kann es sich tatsächlich um eine Liste mit einem Element handeln.
Was wird zurückgegeben, wenn Sie ColSelect auswerten? Wenn es {:colname} ist, handelt es sich um 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.
Schauen Sie sich auch Eval list() an
Es gibt ein PDF, das SUPER hilfreich ist, um die diesem Beitrag beigefügten Ausdrücke zu verstehen.
Funktionen zur Ausdrucksverarbeitung: Teil I – Expr(), NameExpr(), Eval(), ... entschlüsseln Rätsel
Betreff: Spaltenvariable im IF-Ausdruck verwenden1. Guter Thread zum Ersetzen von Werten in der Formel:
Fügen Sie einen Ausdruck in einen anderen ein, indem Sie Eval Insert, Eval Expr, Parse und Substitute verwenden
Wenn Sie keine Formel benötigen, würde ich die Verwendung von << Set Each Value vorschlagen.
2. Sie können die Liste der Spaltennamen mit dt << Get Column Names("String") abrufen und mit Contains() nach Spalten in dieser Liste 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