Comment séparer les valeurs correspondantes dans une listeSalut,
J'ai une liste qui pourrait contenir les éléments suivants, par exemple : {22, 22, 22, 33, 33}. Je veux pouvoir obtenir le numéro de chaque valeur unique dans la liste, par exemple le nombre de 22 et le nombre de 33. Le problème est que je ne sais pas combien de temps ma liste sera et combien de numéros uniques il y aura dans la liste. Existe-t-il un moyen dans JSL de généraliser une solution à ce problème ?
Merci
Automatisation et scriptsRe : Comment séparer les valeurs correspondantes dans une listeJe pense que votre dernière modification doit remplacer "my_bigger_list" par "my_list".
Re : Comment séparer les valeurs correspondantes dans une listeSalut,
Pas de soucis, j'ai résolu le problème et votre solution ne faisait pas partie du problème. Merci.
Re : Comment séparer les valeurs correspondantes dans une liste@pmroz La réponse de m'a intéressé.Parce que j'essaie généralement d'éviter les tableaux de données si je le peux, simplement à cause des frais généraux.J'ai joué avec les timings
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,
)}
),
)
);
et évidemment cela dépend de la taille de la liste.Mais je l'ai exécuté 20 fois chacun sur différentes tailles de liste et j'ai obtenu ceci

Le design était le moyen le plus rapide que j’ai pu trouver pour y parvenir.Et je suis tout à fait d'accord avec @txnelson que je n'aime pas Summarize à cause de son caractère qui renvoie toujours.
Re : Comment séparer les valeurs correspondantes dans une listeJe suis un grand fan de 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);
*Edit* J'ai réalisé que le tri prenait beaucoup de temps donc c'est beaucoup plus rapide
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));
*Modifier à nouveau (je ne sais pas pourquoi cela me dérange autant)* Je n'ai pas aimé le tableau associatif et c'est encore plus rapide
names default to here(1);
my_list = {44, 33, 22, 33, 44};
d = design(my_bigger_list, <<LEVELS></LEVELS>Re : Comment séparer les valeurs correspondantes dans une listeSi vous parcourez une colonne d'un fichier, pourquoi ne pas simplement utiliser les commandes Tabulation ou Résumé ?Si vous regroupez des éléments par une autre colonne, vous pouvez l'utiliser comme variable "par".Par exemple:
| IDENTIFIANT |
Valeur |
| UN |
1 |
| UN |
2 |
| UN |
2 |
| B |
2 |
| B |
3 |
| B |
3 |
| B |
4 |
| B |
4 |
À l’aide de tabulation, faites glisser les colonnes ID et Valeur sur la zone de dépôt des lignes.Vous devrez modifier le rôle de Value pour qu'il soit une variable de regroupement.Voici le résultat :
| IDENTIFIANT |
Valeur |
N |
| UN |
1 |
1 |
| UN |
2 |
2 |
| B |
2 |
1 |
| B |
3 |
2 |
| B |
4 |
2 |
Donc pour A vous avez deux valeurs distinctes (1, 2), ainsi que le nombre d'occurrences (1, 2).Pour B, vous avez trois valeurs distinctes (2, 3, 4), ainsi que des occurrences (1, 2, 2).
Voici le JSL équivalent :
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 : Comment séparer les valeurs correspondantes dans une listePouvez-vous publier des données et du code ?
Re : Comment séparer les valeurs correspondantes dans une listeSalut @pmroz ,
J'ai essayé la première solution que vous avez publiée et elle fonctionne bien avec un seul fichier/liste. Mais lorsque j'utilise votre code comme fonction et que je le parcours en boucle (même si j'ai initialisé toutes mes variables pour m'assurer que rien de l'itération précédente n'est stocké), cela ne semble pas fonctionner. Je fais référence à un fichier car je parcoure une colonne du fichier pour obtenir la liste utilisée. Avez-vous des idées sur ce qui se passe car je me suis assuré d'initialiser toutes les listes et variables ?
Re : Comment séparer les valeurs correspondantes dans une liste@Jaz ,
Il s'agit d'une approche alternative, avec l'utilisation 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 : Comment séparer les valeurs correspondantes dans une listeVeuillez publier cette suggestion dans la zone Liste de souhaits de la Communauté.
Re : Comment séparer les valeurs correspondantes dans une listeMon support pour la plateforme de résumé est que la variable de regroupement est conservée avec le même type de données dans le tableau de données récapitulatif que dans le tableau de données d'origine.Dans la fonction Summarize(), elle est toujours renvoyée sous forme de valeurs de caractères, même si la colonne By spécifiée était numérique.
Re : Comment séparer les valeurs correspondantes dans une listeje suis d'accord avec @pmroz et @txnelson , les tableaux de données facilitent cette tâche.
je préfère le Résumer() fonction terminée Tabuler et Résumé pour ça cependant.
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 : Comment séparer les valeurs correspondantes dans une listeMerci,
Ce serait utile si JMP incluait une fonction de recherche d'éléments correspondants/de retour d'éléments correspondants pour les listes/tableaux associatifs comme ils le font pour les colonnes et les lignes.
Re : Comment séparer les valeurs correspondantes dans une listeN'oubliez pas de résumer.Encore plus court.
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 : Comment séparer les valeurs correspondantes dans une listeVoici ma variation sur @pmroz solution.C'est plutôt une solution à l'ancienne
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 : Comment séparer les valeurs correspondantes dans une listeLes opérations sur les tables sont probablement le moyen le plus rapide d'y parvenir.
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 : Comment séparer les valeurs correspondantes dans une listeJ'ai réussi à obtenir une liste des valeurs uniques comme {22, 33} en utilisant des tableaux associatifs et la fonctionnalité << get key mais je ne sais toujours pas comment obtenir le numéro de chacune de ces valeurs uniques dans l'original liste.