Classement alphabétique des données nominalesSi j'ai une colonne de données nominales où les entrées peuvent apparaître plusieurs fois, existe-t-il un moyen d'avoir une colonne dans laquelle la sortie est le classement alphabétique de l'entrée ? Je peux suivre la voie du script, mais je préférerais une formule de colonne simple.
Automatisation et scriptsAnalyse et modélisation de données de baseRé: Classement alphabétique des données nominalesIl est tard dans la journée, donc ma solution n'est probablement pas la meilleure, cependant en utilisant le tableau de données Big Class, voici la formule que j'ai trouvée
As Constant( Summarize( theLevels = by( :age ) ) );
Contains( theLevels, Char( :age ) );

Ré: Classement alphabétique des données nominalesJusqu'à ce que nous obtenions Ajouter un classement dense aux fonctions Ranking Tie et Col Rank, j'utiliserais quelque chose comme celui montré par txnelson dans des cas simples. Il existe toutes sortes de solutions utilisant les fonctions statistiques Col, mais elles ont tendance à être très difficiles à comprendre car vous devez en combiner plusieurs et les unes dans les autres (vous pouvez en trouver dans les commentaires de cet élément de la liste de souhaits).
Ré: Classement alphabétique des données nominalesD'autre part -
avec une solution de contournement aussi intelligente, je crains qu'il faille un certain temps avant que le classement dense soit mis en œuvre.
Merci Jim !!
Ré: Classement alphabétique des données nominales
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
for(i=1, i<16, i++, dt<< Concatenate(dt,append to first table()));
wait(0);
show(nrows(dt));
Print("std rank");
t0 = hptime();
New Column( "std Rank",
Formula(
Col Rank( :height)
)
);
dt << run formulas();
show((hptime()-t0)/1000000);
Print("row_min rank median");
t0 = hptime();
New Column( "dense_Rank_ref1",
Formula(
Col Median(
Col Rank( If( Row() == Col Minimum( Row(), :height ), :height, . ) ),
:height
)
)
);
dt << run formulas();
show((hptime()-t0)/1000000);
print("summarize_contains");
t0 = hptime();
New Column( "dense rank_summarize_contains",
Formula(
As Constant( Summarize( theLevels = by( :height ) ) );
Contains( theLevels, Char( :height ) );
)
);
dt << run formulas();
show((hptime()-t0)/1000000);
print("row_min cumulative sum");
t0 = hptime();
print("- just works after sorting");
dt << Sort( By( :height ), Replace Table);
New Column( "dense_Rank_ref1",
Formula(
Col Cumulative Sum(If(Row() == Col Min(Row(), :height), 1,0))
)
);
dt << run formulas();
show((hptime()-t0)/1000000);
close(dt, nosave);Ré: Classement alphabétique des données nominalesfacteur 2 plus rapide : un détour par le tableau récapitulatif :

dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
for(i=1, i<16, i++, dt<< Concatenate(dt,append to first table()));
t0 = hptime();
dtsum = dt << Summary( Group( :height ),private);
dtsum << New Formula Column(
Operation( Category( "Distributional" ), "Rank" ),
Columns( :height )
);
dtsum << run formulas();
dt << Update(
With(dtsum),
Match Columns( :height = :height ),
Add Columns from Update Table( :"Rank[height]"n ),
Replace Columns in Main Table( None )
);
show((hptime() - t0)/1000000)
Cette approche peut être facilement étendue pour calculer un classement dense également pour les sous-ensembles (groupBy).
Ré: Classement alphabétique des données nominalesLorsque vous créez un tableau récapitulatif au lieu d'utiliser Summarize, vous pouvez utiliser l'approche @txnelson pour calculer les rangs denses pour les sous-ensembles .
l'inconvénient : assez lent

Voir plus...names default to here(1);
Try(close(dt,nosave));
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
for(i=1, i<16, i++, dt<< Concatenate(dt,append to first table()));
t0 = hptime();
//dense rank - with groupby
dt << New Column( "dense rank_ grouped by",
Character,
formula (
local({tmp,myAge},
as constant (
dt = Current Data Table();
dtsum = dt << summary( Group( :age, :height ) );
//dtsum:age << set name(age2);
nr = N Rows( dt );
);
rw = row();
myage = dt:age[row()];
Eval (Eval Expr(myrows = dtsum << get rows where( dtsum:age == Expr(myAge)))); // <- use dtsum:age !!!
tmp = contains(dtsum[myrows,2], dt:height[rw]); // <- use dt:height !!!!
if(row()==nr, close(dtsum, noSave));
tmp
)));
show((hptime() - t0)/1000000)
Ré: Classement alphabétique des données nominalesIl vaut mieux tout mettre dans As Constant et arrêter la « formule » avant que la partie principale ne commence.
... super rapide.
... avec l'aide d'une petite interface graphique : assez flexible

... et via la commande principale qui permet de dormir indéfiniment : même dynamique : )
Names Default To Here( 1 );
Try(
dt = Current Data Table(),
Caption( "no dat table" );
Stop();
);
updateLBox = Function( {t},
(t << sib) << setitems( (t << topparent)[listboxbox( 1 )] << getselected )
);
nw = New Window( "rank unique entries",
<<TYPE></TYPE><EM>Workflows\BuildingBlocks\ColumnOperations\RankUnique_with_ByGroup.jmpflow</EM>
Ré: Classement alphabétique des données nominalessera
Celui-ci est vraiment astucieux. Je peux saisir plusieurs valeurs dans le groupe Par groupe si je maintiens la touche Ctrl enfoncée, mais cela ne fonctionne que sur la dernière entrée pour le nombre d'entrées. Est-ce que je fais quelque chose de mal ?