Liste von Listen transponieren (summarize()) ohne for-SchleifeKann sich irgendjemand eine Möglichkeit vorstellen, eine Liste von Listen so umzuwandeln, wie sie aus dem folgenden Skript stammt, sodass jede Zeile statt nach Spalte gruppiert wird?
Ich weiß, dass ich es mit einer for-Schleife machen kann, aber ich frage mich, ob es etwas Besseres oder weniger Brutales gibt.
Names default to here(1);
dt = open("$SAMPLE_DATA\Big Class.jmp");
summarize(dt, d = By(:age, :sex));
rows = nitems(d);
cols = nitems(d[1]);
show(rows, cols);
// rows = 2;
// cols = 12;
Dazu möchte ich es von 2 Listen mit 12 auf 12 Listen mit 2 ändern.
Ich füge ein paar Leute hinzu, von denen ich denke, dass sie diese Herausforderung entweder mögen oder bereits etwas haben.
@pmroz , @Justin_Chilton , @gzmorgan0 , @msharp , @MS
Betreff: Liste von Listen transponieren (summarize()) ohne for-SchleifeIch hatte genau die gleiche Frage @vince_faller . Danke für die Frage. Ich habe eine Anfrage gestellt, ob eine Funktion wie diese zur nächsten Version von JMP hinzugefügt werden soll. Mal sehen...
https://community.jmp.com/t5/JMP-Wish-List/Transpose-List-of-Lists-without-a-for-loop/idi-p/348968
Betreff: Liste von Listen transponieren (summarize()) ohne for-SchleifeWiederholen: MS, Ihre Wiederholungslösung ist sehr schön. 

Betreff: Liste von Listen transponieren (summarize()) ohne for-SchleifeMS, Wiederholungslösung ist sehr schön!!
Betreff: Liste von Listen transponieren (summarize()) ohne for-SchleifeNames default to here(1);
dt = open("$SAMPLE_DATA\Big Class.jmp");
//Since column formulas are by row, it uses a built in For Loop this maintains the table values but requires a table....<BR />//This is not a solution for two generic lists<BR />
dt << New Column( "Age,Sex",
Expression,
"None",
Formula( Eval List( {:age[Empty()], :sex[Empty()]} ) ),
Suppress Eval
);
myList= (Associative Array(Column("Age,Sex")) <<GET keys=""></GET>Betreff: Liste von Listen transponieren (summarize()) ohne for-SchleifeMit den neuen Python-Hooks in JMP 14 dachte ich, ich könnte schummeln.Meistens funktioniert es.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA\Big Class.jmp");
Summarize(dt, d = By(:age, :sex));
Python Init();
ml = Python Execute(
{d},
{x, d},
"\[
import numpy as np
x = np.transpose(d) # matrix product
print('x=', x)
]\"
);
Show( x, d );
Python Term();Betreff: Liste von Listen transponieren (summarize()) ohne for-SchleifeHier ist eine Idee, die auf Repeat() basiert. Eine Funktion, die im Wesentlichen eine Schleife ist, aber die Liste direkt zurückgibt, ohne dass Zuweisungen in einer Schleife ausgeführt werden müssen.
In früheren Versionen von JMP habe ich festgestellt, dass Repeat() beim Erstellen von Listen viel schneller war als For(), aber ich denke, das wurde in JMP 13 „behoben“.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA\Big Class.jmp");
Summarize(dt, d = By(:age, :sex));
transposed_d = Local({i = 0}, Repeat({i++ ; Eval List({d[1][i], d[2][i]})}, N Items(d[1])));
Betreff: Liste von Listen transponieren (summarize()) ohne for-SchleifeIch habe diesen Weg gefunden, aber er ist langsamer.:(
Names default to here(1);
dt = open("$SAMPLE_DATA\Big Class.jmp")
summarize(dt, list = By(:age, :sex));
rows = nitems(list[1]);
cols = nitems(list);
list_flat = parse("{"||substitute(char(list), "}", "", "{", "")||"}");
insert into(list_flat, repeat({"@@@"}, rows));
list_sort = list_flat[ shape(1::rows*(cols+1), cols+1)` ];
remove from(list_sort, -1);
t_list = parse("{"||
substitute(char(list_sort),
", \!"@@@\!",", "},{"
)
||"}");
Betreff: Liste von Listen transponieren (summarize()) ohne for-SchleifeDie verschachtelten for-Schleifen von PMROZ sind wahrscheinlich die besten.Wenn Sie nach Alternativen suchen, fallen mir zwei weitere Möglichkeiten ein.
Wenn Ihre Daten ausschließlich numerisch sind, könnten Sie Matrizen verwenden, was ziemlich schick wäre.Dabei gibt es keine for-Schleifen. Die von „summieren“ zurückgegebene Liste der Listen gibt jedoch alle Zeichenwerte zurück, auch für numerische Spalten.Das bedeutet, dass Sie eine verschachtelte for-Schleife benötigen würden, um alles in Zahlen umzuwandeln (wenn alle Ihre Daten Spalten sind), sodass dies für Ihr Problem nicht hilfreich ist.
Die zweite Möglichkeit besteht darin, die Liste der Listen in eine Datentabelle umzuwandeln, diese zu transponieren und dann zurückzukehren.Dies erfordert zwei for-Schleifen für die Konvertierungen (mir ist keine clevere Möglichkeit zur Konvertierung zwischen verschachtelten Listen und Datentabellen bekannt).Dies ist wahrscheinlich langsamer als die PMROZ-Lösung, da Sie den Mehraufwand für die Erstellung einer Datentabelle haben, bei größeren Datensätzen ist es jedoch möglicherweise schneller.Wenn Sie nicht tatsächlich wieder in eine Liste mit Listen konvertieren und stattdessen einfach die transponierte Datentabelle verwenden, können Sie ebenfalls etwas Zeit sparen.
Names default to here(1);
dt = open("$SAMPLE_DATA\Big Class.jmp");
summarize(dt, d = By(:age, :sex));
rows = nitems(d);
cols = nitems(d[1]);
show(rows, cols);
//Turn List of Lists into DT ()
dtLL = New Table("Lists of Lists");
for(i=1,i<=nitems(d),i++,
dtLL << New Column(char(i), Character, Nominal, Values(d[i]));
);
//Transpose DT
cols = dtLL << Get Column Names;
dtT = dtLL << Transpose(columns(cols));
//Turn back into list of lists
trans_list = {};
for(i=2,i<=ncols(dtT),i++,
trans_list[i] = column(dtT,i) <<GET values=""></GET>Betreff: Liste von Listen transponieren (summarize()) ohne for-SchleifeDOH!Ich nehme an, Sie könnten die Ergebnisse in eine Tabelle schreiben, diese transponieren und Listen aus der Tabelle erstellen. Möglicherweise ist dort jedoch noch eine for-Schleife enthalten.Hmmm...
Betreff: Liste von Listen transponieren (summarize()) ohne for-SchleifeIch habe das Gefühl, dass Sie den Teil ohne for-Schleife nicht gelesen haben. 
Betreff: Liste von Listen transponieren (summarize()) ohne for-SchleifeEs ist keine goldene Uhr, aber sie funktioniert.
Names default to here(1);
dt = open("$SAMPLE_DATA\Big Class.jmp");
summarize(dt, d = By(:age, :sex));
nrows = nitems(d);
ncols = nitems(d[1]);
show(nrows, ncols);
// nrows = 2;
// ncols = 12;
trans_list = {};
for (i = 1, i <= ncols, i++,
one_list = {};
for (k = 1, k <= nrows, k++,
one_list[k] = d[k][i];
);
trans_list[i] = one_list;
);
show(trans_list);
trans_list = {{"12", "F"}, {"12", "M"}, {"13", "F"}, {"13", "M"}, {"14", "F"}, {"14", "M"}, {"15", "F"}, {"15", "M"}, {"16", "F"}, {"16", "M"}, {"17", "F"}, {"17", "M"}};