Clasificación alfabética de datos nominalesSi tengo una columna de datos nominales donde las entradas pueden ocurrir más de una vez, ¿hay alguna manera de tener una columna donde la salida sea la clasificación alfabética de la entrada? Puedo utilizar la ruta de la secuencia de comandos, pero preferiría una fórmula de columna simple.
Automatización y scriptingAnálisis y modelado de datos básicosRe: Clasificación alfabética de datos nominalesYa es tarde, por lo que mi solución probablemente no sea la mejor; sin embargo, utilizando la tabla de datos de Big Class, aquí está la fórmula que se me ocurrió.
As Constant( Summarize( theLevels = by( :age ) ) );
Contains( theLevels, Char( :age ) );

Re: Clasificación alfabética de datos nominalesHasta que obtengamos la función Agregar clasificación densa a las funciones de empate de clasificación y clasificación de columnas, usaría algo como lo que mostró txnelson en casos simples. Hay todo tipo de soluciones que utilizan funciones estadísticas de columnas, pero tienden a ser muy difíciles de entender, ya que hay que combinar varias de ellas y unas dentro de otras (puede encontrar algunas en los comentarios de ese elemento de la lista de deseos).
Re: Clasificación alfabética de datos nominalesPor otro lado -
Aunque es una solución tan inteligente, temo que pasará algún tiempo hasta que se implemente la clasificación densa .
¡¡¡Gracias Jim!!!
Re: Clasificación alfabética de datos 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);Re: Clasificación alfabética de datos nominalesFactor 2 más rápido: un desvío a través de la tabla resumen:

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)
Este enfoque se puede ampliar fácilmente para calcular la clasificación densa también para subconjuntos (groupBy).
Re: Clasificación alfabética de datos nominalesAl crear una tabla de resumen en lugar de utilizar Resumir, se puede utilizar el enfoque @txnelson para calcular rangos densos para subconjuntos .
La desventaja: bastante lento

Ver más...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: Clasificación alfabética de datos nominalesEs mejor poner todo en As Constante y detener la "fórmula" antes de que comience la parte principal.
... súper rápido.
... con la ayuda de una pequeña GUI: bastante flexible

...y a través del comando principal se le permite dormir para siempre: incluso dinámico : )
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>Flujos de trabajo\Bloques de construcción\Operaciones de columna\RankUnique_with_ByGroup.jmpflow</EM>
Re: Clasificación alfabética de datos nominalesserá
Esta es realmente inteligente. Puedo ingresar múltiples valores en Por grupo si mantengo presionada la tecla Ctrl, pero solo funciona en la última entrada del número de entradas. ¿Estoy haciendo algo mal?