transponer lista de listas (resumen ()) sin un bucle for¿Alguien puede pensar en una forma de transponer una lista de listas como la que aparece en el siguiente script para que cada fila se agrupe en lugar de por columna?
Sé que puedo hacerlo con un bucle for, pero me pregunto si hay algo mejor o menos 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;
Para esto quiero cambiarlo de 2 listas de 12 a 12 listas de 2.
Añadir a algunas personas que creo que les gustará este desafío o que ya tengan algo.
@pmroz , @Justin_Chilton , @ gzmorgan0 , @msharp , @Sra
Re: transponer la lista de listas (resumen ()) sin un bucle forRepetir: MS su solución de repetición es muy agradable. 
Re: transponer la lista de listas (resumen ()) sin un bucle forMS, repito soution es muy bonito !!
Re: transponer la lista de listas (resumen ()) sin un bucle 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: transponer la lista de listas (resumen ()) sin un bucle forUsando los nuevos ganchos de Python en JMP 14, pensé que podía hacer trampa. En su mayoría funciona.
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: transponer la lista de listas (resumen ()) sin un bucle forAquí hay una idea basada en Repeat (). Una función que esencialmente es un bucle pero devuelve la lista directamente, sin la necesidad de realizar un bucle en ninguna asignación.
En versiones anteriores de JMP experimenté que Repeat () era mucho más rápido que For () en la creación de listas, pero creo que eso se "solucionó" en 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: transponer la lista de listas (resumen ()) sin un bucle forLo encontré de esta manera pero es más lento. 
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: transponer la lista de listas (resumen ()) sin un bucle forPMROZ anidado para bucles es probablemente el mejor. Si estás buscando alternativas, puedo pensar en dos formas adicionales.
Si sus datos son todos numéricos, podría usar matrices que serían bastante hábiles. Esto no tiene para los bucles, sin embargo, la lista de listas devueltas de resumen devuelve todos los valores de caracteres, incluso para columnas numéricas. Lo que significa que necesitaría un bucle anidado para convertir todo en números (si todos sus datos son columnas) para que no sea útil para su problema.
La segunda opción es convertir la lista de listas en una tabla de datos, transponer eso y luego regresar. Esto requiere dos bucles para las conversiones (no conozco ninguna forma sencilla de convertir entre listas anidadas y tablas de datos). Esto probablemente sea más lento que la solución de PMROZ, ya que tiene la sobrecarga de crear una tabla de datos, sin embargo, posiblemente sea más rápido para conjuntos de datos más grandes. Si en realidad no vuelve a convertir a una lista de listas y simplemente usa la tabla de datos transpuesta, también puede ahorrar algo de tiempo.
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: transponer la lista de listas (resumen ()) sin un bucle forDOH! Supongo que podría escribir los resultados en una tabla, transponer eso y crear listas a partir de la tabla. Puede que todavía tenga un bucle for allí. Hmmmm ...
Re: transponer la lista de listas (resumen ()) sin un bucle forSiento que no leíste la parte sin un bucle for. :PAG
Re: transponer la lista de listas (resumen ()) sin un bucle forNo es un reloj de oro pero funciona.
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"}};Re: transponer lista de listas (resume ()) sin un bucle forTenía exactamente la misma pregunta @vince_faller . Gracias por preguntar. Publiqué una solicitud para que una función como esta se agregue a la próxima versión de JMP. Veamos...
https://community.jmp.com/t5/JMP-Wish-List/Transpose-List-of-Lists-without-a-for-loop/idi-p/348968