Transponieren einer Tabelle mit benutzerdefinierten Argumenten<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ich versuche, eine Tabelle mit einem bekannten Label-Spaltennamen zu transponieren, aber Spaltennamen, die nur zur Laufzeit bekannt sind, zu transponieren. Ich habe seit Stunden versucht, um herauszufinden, wie das geht, aber die Aufgabe ist sehr kompliziert, weil JSL den Transpose-Befehl für die Matrix-Transpose-Funktion und das Argument Columns () für die Funktion missverstanden, die die Namen aller Spalten enthält Der Tisch. Im folgenden Code werden die Listenspalten mit den Namen der Spalten aufgefüllt, die ich transponieren möchte.
// Erstellen Sie den Transponierungsausdruck
transposeExpr = Expr (Transpose (Spalten (), Beschriftung (: Wt oder Rd)));
// Zieh den Columns-Argumentausdruck daraus heraus (dies hindert mich daran, ihn selbst erstellen zu müssen und ihn für die Columns () - Funktion halten zu lassen)
columnExpr = Arg (transposeExpr, 1);
Für (i = 1, i <= numColumns, i ++,
Einfügen in (columnExpr, Name Expr (als Spalte) (colNames )));
);
Entfernen von (transposeExpr, 1);
Einfügen in (transposeExpr, Name Expr (SpaltenExpr), 1);
cdt = Current Data Table ();
cdt << Transpose (Name Ausdruck (Spaltenausdruck), Bezeichnung (: Wt oder Rd));
Dies scheint jedoch immer noch nicht zu funktionieren, weil columnExpr immer noch eine Liste mit Namen aller Spalten in der aktuellen Tabelle auswertet und nicht das Columns-Argument mit tatsächlichen Verweisen auf die Tabelle. (Ich denke, es interpretiert diese Verweise als Argumente für die Funktion der Spalten)
Kann jemand bitte erklären, was ich falsch mache?
Betreff: Transponieren einer Tabelle mit benutzerdefinierten Argumenten1 Transponieren (Spalten () .... ) erwartet eine Reihe von durch Kommas getrennten Spaltennamen, so wie Sie es manuell ausfüllen würden. Es erwartet nicht den Namen einer Liste und weiß nicht, wie die Informationen aus dem Namen der Liste extrahiert werden sollen, die die gewünschten Spaltennamen enthält. Die Eval-Funktion schließt die Lücke. So sehe ich das Problem, aber jemand anderes kann es technisch genauer erklären.
2 Column () versus As Column: Ich bin nicht sicher, wie sie sich unterscheiden. Die kurzen Beispiele in den Dokumenten lassen sie in ihrer Funktion als austauschbar erscheinen. Mich würde interessieren, dass jemand Unterschiede aufzeigen kann.
Betreff: Transponieren einer Tabelle mit benutzerdefinierten ArgumentenDas scheint zu funktionieren. Ich mache das:
colList = List ();
Für (i = 1, i <= numColumns, i ++,
Einfügen in (colList, Column (colNames.) ));
);
cdt = Current Data Table ();
cdt << Transpose (Spalten (Eval (colList))), Label (: Wt oder Rd));
Warum muss ich Eval für colList in der abschließenden Nachricht wählen? Was ist der Unterschied zwischen Column () und As Column ()?
Betreff: Transponieren einer Tabelle mit benutzerdefinierten ArgumentenNicht sicher, ob ich genau verstehe, was Sie tun möchten, aber vielleicht wäre dieses Beispiel hilfreich, wenn die Fitnessdaten aktuell sind.
collist = {: Age,: Oxy,: Runtime};
Datentabelle ("Fitness") << Transponieren (
Spalten (Eval (Collist)),
Markenname ),
Ausgabetabelle ("Transpose of Fitness")
)
Betreff: Transponieren einer Tabelle mit benutzerdefinierten ArgumentenWenn ich solche Probleme habe, baue ich dynamisch einen String auf und führe ihn mit eval (parse ()) aus. Es ist etwas rohe Gewalt, aber ich werde mit all den verschiedenen Funktionen wie expr, eval, parse, name expr usw. in Knoten gebunden.
Das sollte es tun:
transposeStr = "cdt << Transpose (Spalten (" ;
Zum ( ich = 1 . ich <= numColumns . ich ++
transposeStr = transposeStr || ":" || colNames [ ich ] || "," ;
) ;
// Entferne das letzte Komma
Clen = Länge ( transposeStr ) ;
transposeStr = substr ( transposeStr . 1 . ( Clen - 2 )) ;
// Füge das Label-Argument hinzu
transposeStr = transposeStr || "), Label (: Wt oder Rd)) ;
eval ( analysieren ( transposeStr )) ;