Come separare i valori corrispondenti in un elencoCIAO,
Ho un elenco che potrebbe contenere quanto segue, ad esempio: {22, 22, 22, 33, 33}. Voglio essere in grado di ottenere il numero di ciascun valore univoco nell'elenco, ad esempio il numero di 22 e il numero di 33. Il problema è che non so quanto sarà lunga la mia lista e quanti numeri univoci ci saranno nell'elenco. Esiste un modo in JSL per generalizzare una soluzione a questo?
Grazie
Automazione e scriptingRi: Come separare i valori corrispondenti in un elencoCredo che la tua ultima modifica debba cambiare "my_bigger_list" in "my_list"
Ri: Come separare i valori corrispondenti in un elencoCIAO,
Non preoccuparti, ho risolto il problema e la tua soluzione non era parte del problema. Grazie.
Ri: Come separare i valori corrispondenti in un elenco@pmroz la risposta di mi ha interessato.Perché di solito cerco di evitare le tabelle di dati, se posso, solo a causa del sovraccarico.Ho giocato con i tempi
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,
)}
),
)
);
e ovviamente dipende dalla dimensione della lista.Ma l'ho eseguito 20 volte ciascuno su elenchi di varie dimensioni e ho ottenuto questo

Il design è stato il modo più veloce che ho trovato per farlo.E sono decisamente d'accordo @txnelson che non mi piace Riassumi perché ritorna sempre il personaggio.
Ri: Come separare i valori corrispondenti in un elencoSono un grande fan del design.
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);
*Modifica* Mi sono reso conto che l'ordinamento richiedeva molto tempo, quindi è molto più veloce
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));
*Modifica di nuovo (non so perché mi dà così tanto fastidio)* Non mi piaceva l'array associativo e questo è ancora più veloce
names default to here(1);
my_list = {44, 33, 22, 33, 44};
d = design(my_bigger_list, <<LEVELS></LEVELS>Ri: Come separare i valori corrispondenti in un elencoSe stai scorrendo una colonna in un file, perché non utilizzare semplicemente i comandi Tabula o Riepilogo?Se stai raggruppando le cose in base a un'altra colonna, puoi utilizzarla come variabile "per".Per esempio:
| ID |
Valore |
| UN |
1 |
| UN |
2 |
| UN |
2 |
| B |
2 |
| B |
3 |
| B |
3 |
| B |
4 |
| B |
4 |
Utilizzando la tabulazione trascina le colonne ID e Valore sulla zona di rilascio per le righe.Dovrai modificare il ruolo di Valore in modo che sia una variabile di raggruppamento.Questo è il risultato:
| ID |
Valore |
N |
| UN |
1 |
1 |
| UN |
2 |
2 |
| B |
2 |
1 |
| B |
3 |
2 |
| B |
4 |
2 |
Quindi per A hai due valori distinti (1, 2), insieme al numero di occorrenze (1, 2).Per B hai tre valori distinti (2, 3, 4), insieme alle occorrenze (1, 2, 2).
Ecco il 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;Ri: Come separare i valori corrispondenti in un elencoPuoi postare alcuni dati e codice?
Ri: Come separare i valori corrispondenti in un elencoCIAO @pmroz ,
Ho provato la prima soluzione che hai pubblicato e funziona bene con un file/elenco. Ma quando utilizzo il tuo codice come funzione e lo eseguo in loop (nonostante abbia inizializzato tutte le mie variabili per assicurarmi che non venga memorizzato nulla dell'iterazione precedente) non sembra funzionare. Mi riferisco a un file perché eseguo il ciclo di una colonna nel file per ottenere l'elenco utilizzato. Qualche idea su cosa sta succedendo dato che mi sono assicurato di inizializzare tutti gli elenchi e le variabili?
Ri: Come separare i valori corrispondenti in un elenco@Jaz ,
Questo è un approccio alternativo, con l'uso di 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);
Ri: Come separare i valori corrispondenti in un elencoSi prega di pubblicare questo suggerimento nell'area Lista dei desideri della Community.
Ri: Come separare i valori corrispondenti in un elencoIl mio supporto per la piattaforma di riepilogo è che la variabile di raggruppamento viene mantenuta con lo stesso tipo di dati nella tabella dei dati di riepilogo come nella tabella dei dati di origine.Nella funzione Summarize(), viene sempre restituito come valore di carattere, anche se la colonna By specificata era numerica.
Re: Come separare i valori corrispondenti in un elencoSono d'accordo con @pmroz E @txnelson , le tabelle dati lo rendono semplice.
Preferisco il Riassumere() funzione finita Tabulare E Riepilogo per questo però.
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: Come separare i valori corrispondenti in un elencoGrazie,
Sarebbe utile se JMP includesse una funzione di ricerca di elementi corrispondenti/restituzione di elementi corrispondenti per elenchi/array associativi come fanno per colonne e righe.
Re: Come separare i valori corrispondenti in un elencoNon dimenticare di riassumere.Ancora più breve.
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: Come separare i valori corrispondenti in un elencoEcco la mia variazione su @pmroz soluzione.È più una soluzione vecchia scuola
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: Come separare i valori corrispondenti in un elencoLe operazioni sulle tabelle sono probabilmente il modo più veloce per farlo.
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: Come separare i valori corrispondenti in un elencoSono riuscito a ottenere un elenco di valori univoci in questo modo {22, 33} utilizzando array associativi e la funzionalità << ottieni chiave ma non so ancora come ottenere il numero di ciascuno di questi valori univoci nell'originale elenco.