Alphabetische Rangfolge der NominaldatenWenn ich eine Spalte mit nominalen Daten habe, deren Eingaben mehr als einmal vorkommen können, gibt es dann eine Möglichkeit, eine Spalte zu erstellen, deren Ausgabe die alphabetische Rangfolge der Eingaben ist? Ich kann den Skriptweg gehen, aber ich bevorzuge eine einfache Spaltenformel.
Automatisierung und SkriptingGrundlegende Datenanalyse und ModellierungBetreff: Alphabetische Rangfolge der NominaldatenEs ist schon spät am Tag, also ist meine Lösung wahrscheinlich nicht die beste, aber hier ist die Formel, die ich anhand der Big Class-Datentabelle erstellt habe.
As Constant( Summarize( theLevels = by( :age ) ) );
Contains( theLevels, Char( :age ) );

Betreff: Alphabetische Rangfolge der NominaldatenBis wir den Funktionen „Ranking Tie“ und „Col Rank“ eine dichte Rangfolge hinzufügen können, würde ich etwas verwenden, wie es txnelson in einfachen Fällen gezeigt hat. Es gibt alle möglichen Lösungen mit statistischen Col-Funktionen, aber sie sind in der Regel sehr schwer zu verstehen, da Sie mehrere davon kombinieren und ineinander einfügen müssen (einige finden Sie in den Kommentaren zu diesem Wunschlistenelement).
Betreff: Alphabetische Rangfolge der NominaldatenAndererseits -
Bei solch einem cleveren Workaround befürchte ich, dass es noch eine Weile dauern wird, bis ein dichtes Ranking implementiert wird.
Danke, Jim!!
Betreff: Alphabetische Rangfolge der Nominaldaten
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);Betreff: Alphabetische Rangfolge der NominaldatenFaktor 2 schneller: der Umweg über die Übersichtstabelle:

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)
Dieser Ansatz kann leicht erweitert werden, um eine dichte Rangfolge auch für Teilmengen (groupBy) zu berechnen.
Betreff: Alphabetische Rangfolge der NominaldatenWenn Sie statt der Verwendung von „Summarize“ eine Übersichtstabelle erstellen, können Sie mit dem @txnelson -Ansatz dichte Ränge für Teilmengen berechnen.
der Nachteil: ziemlich langsam

Mehr anzeigen...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)
Betreff: Alphabetische Rangfolge der NominaldatenSetzen Sie lieber alles in „As Constant“ ein und beenden Sie die „Formel“, bevor der Hauptteil beginnt.
... super schnell.
... mit Hilfe einer kleinen GUI: sehr flexibel

... und über den Hauptbefehl, der für immer schlafen darf: sogar dynamisch : )
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>
Betreff: Alphabetische Rangfolge der Nominaldatenwird sein
Das ist wirklich clever. Ich kann mehrere Werte in die Gruppe „Nach Gruppe“ eingeben, wenn ich die Strg-Taste gedrückt halte, aber die Anzahl der Eingaben wird nur auf den letzten Eintrag angewendet. Mache ich etwas falsch?