Classificazione alfabetica dei dati nominaliSe ho una colonna di dati nominali in cui gli input possono verificarsi più di una volta, esiste un modo per avere una colonna in cui l'output è la classifica alfabetica dell'input? Posso seguire la strada dello scripting, ma preferirei una semplice formula di colonna.
Automazione e scriptingAnalisi e modellazione dei dati di baseRe: Classificazione alfabetica dei dati nominaliÈ tardi, quindi la mia soluzione probabilmente non è la migliore, tuttavia utilizzando la tabella dati Big Class, ecco la formula che ho elaborato
As Constant( Summarize( theLevels = by( :age ) ) );
Contains( theLevels, Char( :age ) );

Re: Classificazione alfabetica dei dati nominaliFinché non avremo Add dense ranking to Ranking Tie e Col Rank functions, userei qualcosa come txnelson ha mostrato nei casi semplici. Ci sono tutti i tipi di soluzioni che utilizzano le funzioni statistiche Col, ma tendono a essere molto difficili da capire perché devi combinarne più di una e l'altra all'interno di un'altra (puoi trovarne alcune nei commenti di quell'elemento della lista dei desideri).
Re: Classificazione alfabetica dei dati nominaliD'altra parte -
Con questa soluzione intelligente temo che ci vorrà del tempo prima che venga implementata una classificazione più densa .
Grazie Jim!!
Re: Classificazione alfabetica dei dati nominali
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);Re: Classificazione alfabetica dei dati nominalifattore 2 più veloce: una deviazione tramite la tabella riassuntiva:

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)
Questo approccio può essere facilmente esteso per calcolare una classificazione densa anche per sottoinsiemi (groupBy).
Re: Classificazione alfabetica dei dati nominaliQuando si crea una tabella riepilogativa invece di utilizzare Summarize, è possibile @txnelson utilizzare l'approccio per calcolare ranghi densi per i sottoinsiemi .
lo svantaggio: piuttosto lento

Vedi altro...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)
Re: Classificazione alfabetica dei dati nominaliMeglio mettere tutto in As Constant e interrompere la "formula" prima che inizi la parte principale.
... super veloce.
... con l'aiuto di una piccola GUI: abbastanza flessibile

... e tramite il comando principale che consente di dormire per sempre: anche dinamico : )
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>Flussi di lavoro\BuildingBlocks\ColumnOperations\RankUnique_with_ByGroup.jmpflow</EM>
Re: Classificazione alfabetica dei dati nominalisarà
Questo è davvero intelligente. Posso inserire più valori in By Group se tengo premuto il tasto Ctrl, ma funziona solo sull'ultima voce per il numero di input. Sto sbagliando qualcosa?