Cómo separar valores coincidentes en una listaHola,
Tengo una lista que podría contener lo siguiente, por ejemplo: {22, 22, 22, 33, 33}. Quiero poder obtener el número de cada valor único en la lista, por ejemplo, el número de 22 y el número de 33. El problema es que no sé cuánto tiempo durará mi lista ni cuántos números únicos habrá en ella. ¿Hay alguna forma en JSL de generalizar una solución para esto?
Gracias
Automatización y secuencias de comandosRe: Cómo separar valores coincidentes en una listaCreo que en tu última edición es necesario cambiar "my_bigger_list" a "my_list"
Re: Cómo separar valores coincidentes en una listaHola,
No te preocupes, resolví el problema y tu solución no fue parte del problema. Gracias.
Re: Cómo separar valores coincidentes en una lista@pmroz La respuesta me interesó.Porque normalmente trato de evitar las tablas de datos si puedo solo por la sobrecarga.jugué con los tiempos
names default to here(1);
my_list = {44, 33, 22, 33, 44};
repeat_list = [1, 5, 10, 50, 100, 1000, 2500, 5000, 7500, 10000];
dt_timing = new table("Timings",
new column("List Size"),
new column("Design"),
new column("Loop"),
new column("Summarize"),
);
for(ii=1, ii<=20, ii++,
for(ir = 1, ir <= nitems(repeat_list), ir++,
my_bigger_list = repeat(my_list, repeat_list[ir]);
// using design
st = HPTime();
aa = associative array(my_bigger_list);
keys = aa << Get Keys;
d = design(my_bigger_list, keys);
aa_design = associative array(keys, VSum(d));
time_design = HPTime() - st;
//using a loop
st = HPTime();
aa_loop = associative array(my_bigger_list, repeat(0, nitems(my_bigger_list)));
for(i=1, i<=nitems(my_bigger_list), i++,
aa_loop[my_bigger_list[i]]++;
);
time_loop = HPTime() - st;
//using a data table
st = HPTime();
dt = New Table( "Untitled", invisible, Add Rows( nitems(my_bigger_list) ),
New Column( "Column 1", Numeric, "Continuous", Format( "Best", 12 ),
Set Values( my_bigger_list )
)
);
summarize(dt, unique_value_list = by(:column1), unique_count = count(:column 1) );
close(dt, nosave);
aa_peter = associative array(unique_value_list, unique_count);
time_peter = HPTime()-st;
Eval(EvalExpr(
dt_timing << Add Rows({List Size = Expr(Nitems(my_bigger_list)), Design = Expr(time_design), Loop = Expr(time_loop), Summarize = Expr(time_peter)});
));
);
);
dt_stack = dt_timing << Stack(
columns( :Design, :Loop, :Summarize ),
Source Label Column( "Method" ),
Stacked Data Column( "Timing" )
);
close(dt_timing, no save);
biv = dt_stack << Bivariate(
Y( :Timing ),
X( :List Size ),
group by(:Method),
fit line(),
SendToReport(
Dispatch(
{},
"Bivar Plot",
FrameBox,
{Row Legend(
Method,
)}
),
)
);
y obviamente depende del tamaño de la lista.Pero lo ejecuté 20 veces cada una en varios tamaños de lista y obtuve esto

El diseño fue la forma más rápida que pude encontrar para hacerlo.Y definitivamente estoy de acuerdo con @txnelson que no me gusta Summarize porque siempre regresa el personaje.
Re: Cómo separar valores coincidentes en una listaSoy un gran admirador del diseño.
names default to here(1);
l = {22, 22, 22, 33, 33};
l = sort ascending(l);
d = VSuM(design(l));
csum = cumulative sum(d);
lvalues = l[csum];
aa = associative array(lvalues, d);
*Editar* Me di cuenta de que ordenar estaba tomando mucho tiempo, así que esto es mucho más rápido
names default to here(1);
my_list = {44, 33, 22, 33, 44};
aa = associative array(my_list );
keys = aa << Get Keys;
d = design(my_list , keys);
aa_design = associative array(keys, VSum(d));
*Editar de nuevo (no sé por qué esto me molesta tanto)* No me gustó la matriz asociativa y esto es aún más rápido
names default to here(1);
my_list = {44, 33, 22, 33, 44};
d = design(my_bigger_list, <<LEVELS></LEVELS>Re: Cómo separar valores coincidentes en una listaSi está recorriendo una columna de un archivo, ¿por qué no utilizar los comandos Tabular o Resumen?Si está agrupando cosas por otra columna, puede usarla como variable "por".Por ejemplo:
| IDENTIFICACIÓN |
Valor |
| A |
1 |
| A |
2 |
| A |
2 |
| B |
2 |
| B |
3 |
| B |
3 |
| B |
4 |
| B |
4 |
Usando tabular, arrastre las columnas ID y Valor sobre la zona de colocación de filas.Deberá cambiar la función de Valor para que sea una variable de agrupación.Este es el resultado:
| IDENTIFICACIÓN |
Valor |
norte |
| A |
1 |
1 |
| A |
2 |
2 |
| B |
2 |
1 |
| B |
3 |
2 |
| B |
4 |
2 |
Entonces, para A tienes dos valores distintos (1, 2), junto con el número de apariciones (1, 2).Para B tiene tres valores distintos (2, 3, 4), junto con ocurrencias (1, 2, 2).
Aquí está el JSL equivalente:
dt = New Table( "Test", Add Rows( 8 ),
New Column( "ID", Character, "Nominal",
Set Values( {"A", "A", "A", "B", "B", "B", "B", "B"} ) ),
New Column( "Value", Numeric, "Continuous", Format( "Best", 12 ),
Set Values( [1, 2, 2, 2, 3, 3, 4, 4] ) )
);
dtab = dt << Tabulate(
Show Control Panel( 0 ),
Add Table( Row Table( Grouping Columns( :ID, :Value ) ) ),
invisible
);
dt2 = dtab << Make Into Data Table;Re: Cómo separar valores coincidentes en una lista¿Puedes publicar algunos datos y código?
Re: Cómo separar valores coincidentes en una listaHola @pmroz ,
Probé la primera solución que publicaste y funciona bien con un archivo/lista. Pero cuando uso su código como una función y lo recorro (a pesar de haber inicializado todas mis variables para asegurarme de que no se almacene nada de la iteración anterior), no parece estar funcionando. Me refiero a un archivo porque recorro una columna del archivo para obtener la lista en uso. ¿Alguna idea sobre lo que está pasando ya que me aseguré de inicializar todas las listas y variables?
Re: Cómo separar valores coincidentes en una lista@jaz ,
Este es un enfoque alternativo, con el uso de Loc().
MyList = {22,33,22,22,22,33,33,44,44,44,33,22};
AA = Associative Array(MyList);
UniqueVals = AA << Get Keys;
Frequency = {};
for(i = 1, i <= N Items(UniqueVals),i++,
Insert Into(Frequency,N Rows(Loc(MyList,UniqueVals[i])));
);
Show(Frequency);
Re: Cómo separar valores coincidentes en una listaPublique esta sugerencia en el área Lista de deseos de la comunidad.
Re: Cómo separar valores coincidentes en una listaMi apoyo a la Plataforma de resumen es que la variable de agrupación se mantiene con el mismo tipo de datos en la tabla de datos de resumen que en la tabla de datos de origen.En la función Summarize(), siempre se devuelve como valores de caracteres, incluso si la columna Por especificada era numérica.
Re: Cómo separar valores coincidentes en una listaestoy de acuerdo con @pmroz y @txnelson , las tablas de datos lo hacen fácil.
Prefiero el Resumir() funcionar sobre Tabular y Resumen aunque para esto.
my_list = {22, 22, 22, 33, 33};
dt = New Table( "Untitled",
private,
Add Rows( N Items( my_list ) ),
New Column( "Column 1",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( my_list )
)
);
summarize(dt, group=by(:column 1), n=count(:column 1));
show(group, n);
Re: Cómo separar valores coincidentes en una listaGracias,
Sería útil si JMP incluyera una función de búsqueda de elementos coincidentes/devolver elementos coincidentes para listas/matrices asociativas como lo hacen para columnas y filas.
Re: Cómo separar valores coincidentes en una listaNo olvides resumir.Aún más corto.
my_list = {22, 22, 22, 33, 33};
dt = New Table( "Untitled", invisible, Add Rows( nitems(my_list) ),
New Column( "Column 1", Numeric, "Continuous", Format( "Best", 12 ),
Set Values( my_list )
)
);
summarize(dt, unique_value_list = by(:column1), unique_count = count(:column 1) );
show(unique_value_list, unique_count);
Re: Cómo separar valores coincidentes en una listaAquí está mi variación de @pmroz solución.Es más una solución de la vieja escuela.
my_list = {22, 22, 22, 33, 33};
dt = New Table( "Untitled",
private,
Add Rows( N Items( my_list ) ),
New Column( "Column 1",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( my_list )
)
);
// Use the Summary Platform to create the aggragate values
dtSum = dt << Summary(
private,
Group( :Column 1 ),
Freq( "None" ),
Weight( "None" )
);
// Create the new lists
unique_value_list = As List( dtSum:column 1 << get values );
unique_count = As List( dtSum:n rows << get values );
Close( dt, nosave );
Close( dtSum, nosave );
Show( unique_value_list, unique_count );Re: Cómo separar valores coincidentes en una listaLas operaciones de tabla son probablemente la forma más rápida de hacerlo.
my_list = {22, 22, 22, 33, 33};
dt = New Table( "Untitled", invisible, Add Rows( nitems(my_list) ),
New Column( "Column 1", Numeric, "Continuous", Format( "Best", 12 ),
Set Values( my_list )
)
);
dtab = dt << Tabulate(Show Control Panel( 0 ),
Add Table( Row Table( Grouping Columns( :Column 1 ) ) ));
dt2 = dtab << Make Into Data Table(invisible);
unique_value_list = dt2:column 1 << get values;
unique_count = dt2:n << get values;
close(dt, nosave);
close(dt2, nosave);
show(unique_value_list, unique_count);Re: Cómo separar valores coincidentes en una listaLogré obtener una lista de valores únicos como {22, 33} usando matrices asociativas y la funcionalidad << obtener clave, pero todavía no sé cómo obtener el número de cada uno de esos valores únicos en el original. lista.