<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ich verwende zwei Methoden zum Erstellen von Formelspalten, je nachdem, ob ich weiß, wie viele Variablen die Formel benötigt
- Ausdruck und Ersatz sind leicht zu lesen. Abschnitt 1 im Code erstellt mehrere Formelspalten für jede Variable in einer Liste für den Mittelwert( var, byvar )
- Durch Parsen und Auswerten und möglicherweise durch Einfügen von Auswertungen wird eine einzelne Formelspalte erstellt, die eine Reihe von Variablen erfordert, wobei die Anzahl und der Name durch die Variablenliste festgelegt werden.
- Abschnitt 2a und 2b funktionieren und sind funktional gleichwertig
- Abschnitt 2c und 2d laufen nicht, scheinen aber ein Weg zu einer eleganten Lösung zu sein
Ich hätte gerne Ideen zur Schaffung besserer Praktiken und würde mich über Empfehlungen freuen
Namen standardmäßig hier( 1 );
n=ntable();
dtnms={};
Wenn(
n==0, dtc=1,
n==1, If(current data table() << get name == "Big Class", dtc=0, dtc=1) , // else
for(ii=1, ii <= n, ii++, insert into(dtnms, data table(ii) << getname));
if(contains(dtnms, "Big Class") > 0, dtc=1, dtc=0);
);
if (dtc,dt = Open( "$SAMPLE_DATA/Big Class.jmp" ), dt = data table("Big Class"));
// Abschnitt 1: Mehrere Spalten der Formel hinzufügen und Variablen dynamisch eingeben.
Form1=Ausdruck(
form1col=dt << neue Spalte(Name, Formel(col mean(As Column(YVar), As Column(ByVar))))
);
VarList={"sex", "height", "weight"};
For(ii=2, ii <= N Items(VarList), ii++,
Eval(Substitute(Name expr(form1),
expr(Name), VarList[ii]||" Durchschnittswerte",
expr(YVar), VarList[ii],
expr(ByVar), VarList[1],
));
);
// Abschnitt 2: Durchschnitt der Spalten in der Variablenliste
// Methode 2a Methode funktioniert, ist aber schwer zu debuggen
VarList={"height", "weight", "age"};
Formtxt1 = "formcol = dt << new columns(\!"Methode a: Mean\!", Formula(mean( ";
Formtxt2 = "As Column(\!""||VarList[1]||"\!")";
Wenn(
N Items(VarList)==2, Formtxt2 ||= ", As Column(\!""||VarList[2]||"\!")",
N Items(VarList)>2, For(ii=2, ii <= N Items(VarList), ii++,
Formtxt2 ||= ", As Column(\!""||VarList[ii]||"\!")"
)
);
Formtxt=Formtxt1||Formtxt2||");";
eval(parse(Formtxt));
// Methode 2b: Etwas einfacher zu erkennen
col4=expr(
NewCol1=dt << New Column("Methode b: Mittelwert von "||_names_);
);
form4txt="NewCol1 <
VarList={"height", "weight", "age"};
VarRef = eval list(dt << get Column Reference(VarList));
_Vars_ = "As Column( \!"" || ConCat Items(VarList, "\!"), As Column( \!"") || "\!")";
form4txta = Eval Insert(form4txt);
Eval(Substitute(Name expr(col4),
expr(_names_), concat Items(VarList,", ",)
));
Eval(Parse(form4txta)); //Parse macht den Text zu einem Ausdruck, der ausgewertet wird
// ************************************ //
// ************* Funktioniert nicht ************* //
//Methode 2c: Ich denke, das wäre die beste, aber ich kann es nicht korrigieren. Ich habe immer noch eine Liste
form3=expr(
NewCol=dt << New Column("Mean of "||_names_, Formula(Mean(_Vars_ )));
);
VarList={"height", "weight", "age"};
VarRef = eval list(dt << get Column Reference(VarList));
Eval(Substitute(Name expr(form3),
expr(_names_), concat Items(VarList,", ",),
expr(_Vars_), VarRef
));
// Methode 2d: Verwendung einer Schleife, aber immer noch falsch
form4=expr(
NewCol=dt << New Column("Mean of "||_names_, Formula(Mean(_Vars_ )));
);
VarList={"height", "weight", "age"};
VarRef = eval list(dt << get Column Reference(VarList));
Form4a =Substitute(Name expr(form4),
expr(_names_), concat Items(VarList,", ",)
);
For(ii=1, ii <= N Items(VarList), ii++,
form4a=Ersatz(Name expr(form4a),
expr(_Vars_), expr(VarRef[ii], _Vars_)
);
);
Eval(Substitute(Name expr(form4a),
expr(_Vars_), ""
));
// ************************************ //
// ************* Funktioniert nicht ************* //
Schöne Sammlung verschiedener Methoden.
In letzter Zeit arbeite ich in solchen Fällen lieber mit Ausdrücken als mit Zeichenfolgen. Um eine Formel per JSL festzulegen, erstelle ich zunächst den Ausdruck mit EvalExpr(), den ich dann mit NameExpr() einfüge, um eine Auswertung zur Laufzeit zu vermeiden.
Nachfolgend finden Sie zwei Beispiele, die entweder auf einer Liste mit Spaltennamen oder einer Liste mit Zeichenfolgen basieren. Letzteres ist etwas anspruchsvoller.
dt = Offen ( „$SAMPLE_DATA/Big Class.jmp“ ) ;
// 1. Liste der Spaltennamen
L1 = { Alter , Höhe , Gewicht } ; // ie dt<
Form 1 = Evaluierungsexpr ( Bedeuten ( Ausdruck ( L1 ))) ;
form1col = dt << Neue Spalte ( Concat-Elemente ( Wörter ( Verkohlen ( L1 ) , „{},“ )) || " Durchschnitt" , Formel ( Namensausdruck ( Form 1 ))) ;
// 2. Liste der Zeichenfolgen
L2 = { "Alter" , "Höhe" , "Gewicht" } ; // ie dt<
form2 = Evaluierungsexpr (
Bedeuten (
Ausdruck (
Wiederholen (
ich = 0 ;
{ ich ++ ; Evaluierungsexpr ( Als Spalte ( Ausdruck ( L2 [ ich ])))} ;,
N Artikel ( L2 )
)
)
)
) ;
form2col = dt << Neue Spalte ( Concat-Elemente ( L2 ) || " Durchschnitt" , Formel ( Namensausdruck ( form2 ))) ;