transposer la liste des listes (summarize()) sans boucle forQuelqu'un peut-il penser à un moyen de transposer une liste de listes comme ce qui vient du script suivant afin que chaque ligne soit regroupée plutôt que par colonne.
Je sais que je peux le faire avec une boucle for mais je me demande s'il y a quelque chose de mieux ou de moins brutal.
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;
Pour cela je souhaite le changer de 2 listes de 12 à 12 listes de 2.
Ajouter quelques personnes qui, je pense, pourraient aimer ce défi ou avoir déjà quelque chose.
@pmroz , @Justin_Chilton , @gzmorgan0 , @msharp , @MS
Re : transposer une liste de listes (summarize()) sans boucle forj'avais exactement la même question @vince_faller . Merci d'avoir posé la question. J'ai posté une demande pour qu'une fonctionnalité comme celle-ci soit ajoutée à la prochaine version de JMP. Voyons...
https://community.jmp.com/t5/JMP-Wish-List/Transpose-List-of-Lists-without-a-for-loop/idi-p/348968
Re : transposer une liste de listes (summarize()) sans boucle forRépétez : MS, votre solution de répétition est très agréable. 
Re : transposer une liste de listes (summarize()) sans boucle forMS, répéter la solution est très sympa !!
Re : transposer une liste de listes (summarize()) sans boucle forNames 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>Re : transposer une liste de listes (summarize()) sans boucle forEn utilisant les nouveaux hooks Python dans JMP 14, je pensais pouvoir tricher.Cela fonctionne surtout.
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();Re : transposer une liste de listes (summarize()) sans boucle forVoici une idée basée sur Repeat(). Une fonction qui est essentiellement une boucle mais renvoie la liste directement, sans qu'il soit nécessaire de boucler des affectations.
Dans les versions antérieures de JMP, j'ai constaté que Repeat() était bien plus rapide que For() dans la création de listes, mais je pense que cela a été "corrigé" dans JMP 13.
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])));
Re : transposer une liste de listes (summarize()) sans boucle forJ'ai trouvé cette façon mais c'est plus lent.:(
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),
", \!"@@@\!",", "},{"
)
||"}");
Re : transposer une liste de listes (summarize()) sans boucle forLes boucles for imbriquées de PMROZ sont probablement les meilleures.Si vous recherchez des alternatives, je peux penser à deux manières supplémentaires.
Si vos données sont toutes numériques, vous pouvez utiliser des matrices qui seraient assez astucieuses.Cependant, cela n'a pas de boucles for, la liste des listes renvoyées par summary renvoie toutes les valeurs de caractères, même pour les colonnes numériques.Ce qui signifie que vous auriez besoin d'une boucle for imbriquée pour tout convertir en nombres (si toutes vos données sont des colonnes), cela ne sera donc pas utile pour votre problème.
La deuxième option consiste à convertir la liste de listes en table de données, à la transposer, puis à revenir en arrière.Cela nécessite deux boucles for pour les conversions (je ne connais aucun moyen simple de convertir entre des listes imbriquées et des tables de données).C'est probablement plus lent que la solution de PMROZ puisque vous avez la charge de créer une table de données, cependant, c'est peut-être plus rapide pour des ensembles de données plus volumineux.Si vous ne reconvertissez pas réellement en une liste de listes et utilisez simplement la table de données transposée à la place, vous pourriez également gagner du temps.
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>Re : transposer une liste de listes (summarize()) sans boucle forDOH !Je suppose que vous pouvez écrire les résultats dans un tableau, les transposer et créer des listes à partir du tableau. Il se peut qu'il y ait encore une boucle for là-dedans.Hummm....
Re : transposer une liste de listes (summarize()) sans boucle forJ'ai l'impression que vous n'avez pas lu la partie sans boucle for. 
Re : transposer une liste de listes (summarize()) sans boucle forCe n'est pas une montre en or mais ça marche.
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"}};