So trennen Sie übereinstimmende Werte in einer ListeHallo,
Ich habe eine Liste, die zum Beispiel Folgendes enthalten könnte: {22, 22, 22, 33, 33}. Ich möchte in der Lage sein, die Nummer jedes einzelnen Werts in der Liste zu erhalten, z. B. die Anzahl der 22er und die Anzahl der 33er. Das Problem ist, dass ich nicht weiß, wie lang meine Liste sein wird und wie viele eindeutige Nummern es in der Liste geben wird. Gibt es in JSL eine Möglichkeit, eine Lösung dafür zu verallgemeinern?
Danke
Automatisierung und SkripterstellungBetreff: So trennen Sie übereinstimmende Werte in einer ListeIch glaube, bei Ihrer letzten Bearbeitung muss „my_bigger_list“ in „my_list“ geändert werden.
Betreff: So trennen Sie übereinstimmende Werte in einer ListeHallo,
Keine Sorge, ich habe das Problem gelöst und Ihre Lösung war nicht Teil des Problems. Danke.
Betreff: So trennen Sie übereinstimmende Werte in einer Liste@pmroz Die Antwort hat mein Interesse geweckt.Weil ich normalerweise versuche, Datentabellen zu vermeiden, wenn ich kann, nur wegen des Mehraufwands.Ich habe mit Timings gespielt
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,
)}
),
)
);
und natürlich hängt es von der Listengröße ab.Aber ich habe es jeweils 20 Mal für verschiedene Listengrößen ausgeführt und dieses Ergebnis erhalten

Design war der schnellste Weg, den ich finden konnte.Und dem stimme ich auf jeden Fall zu @txnelson dass ich Summarize nicht mag, weil es immer Zeichen zurückgibt.
Betreff: So trennen Sie übereinstimmende Werte in einer ListeIch bin ein großer Fan von 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);
*Bearbeiten* Mir ist aufgefallen, dass das Sortieren viel Zeit in Anspruch nimmt, daher geht es hier viel schneller
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));
*Erneut bearbeiten (ich weiß nicht, warum mich das so stört)* Mir gefiel das assoziative Array nicht und das ist noch schneller
names default to here(1);
my_list = {44, 33, 22, 33, 44};
d = design(my_bigger_list, <<LEVELS></LEVELS>Betreff: So trennen Sie übereinstimmende Werte in einer ListeWenn Sie eine Spalte in einer Datei durchlaufen, warum verwenden Sie nicht einfach die Befehle Tabulieren oder Zusammenfassung?Wenn Sie Dinge nach einer anderen Spalte gruppieren, können Sie diese als „nach“-Variable verwenden.Zum Beispiel:
| AUSWEIS |
Wert |
| A |
1 |
| A |
2 |
| A |
2 |
| B |
2 |
| B |
3 |
| B |
3 |
| B |
4 |
| B |
4 |
Ziehen Sie mithilfe von Tabulator die Spalten „ID“ und „Wert“ über die Drop-Zone für Zeilen.Sie müssen die Rolle von „Wert“ in eine Gruppierungsvariable ändern.Das ist das Ergebnis:
| AUSWEIS |
Wert |
N |
| A |
1 |
1 |
| A |
2 |
2 |
| B |
2 |
1 |
| B |
3 |
2 |
| B |
4 |
2 |
Für A gibt es also zwei unterschiedliche Werte (1, 2) sowie die Anzahl der Vorkommen (1, 2).Für B gibt es drei unterschiedliche Werte (2, 3, 4) sowie Vorkommen (1, 2, 2).
Hier ist die entsprechende JSL:
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;Betreff: So trennen Sie übereinstimmende Werte in einer ListeKönnen Sie einige Daten und Code posten?
Betreff: So trennen Sie übereinstimmende Werte in einer ListeHallo @pmroz ,
Ich habe die erste Lösung ausprobiert, die Sie gepostet haben, und sie funktioniert gut mit einer Datei/Liste. Aber wenn ich Ihren Code als Funktion verwende und ihn durchlaufe (obwohl ich alle meine Variablen initialisiert habe, um sicherzustellen, dass nichts aus der vorherigen Iteration gespeichert ist), scheint es nicht zu funktionieren. Ich verweise auf eine Datei, weil ich eine Spalte in der Datei durchlaufe, um die verwendete Liste zu erhalten. Irgendwelche Ideen, was los ist, da ich dafür gesorgt habe, dass alle Listen und Variablen initialisiert wurden?
Betreff: So trennen Sie übereinstimmende Werte in einer Liste@Jaz ,
Dies ist ein alternativer Ansatz unter Verwendung von 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);
Betreff: So trennen Sie übereinstimmende Werte in einer ListeBitte posten Sie diesen Vorschlag im Bereich „Wunschliste“ der Community.
Betreff: So trennen Sie übereinstimmende Werte in einer ListeIch unterstütze die Summary Platform darin, dass die Gruppierungsvariable in der Zusammenfassungsdatentabelle als derselbe Datentyp beibehalten wird wie in der Ursprungsdatentabelle.In der Summarize()-Funktion werden sie immer als Zeichenwerte zurückgegeben, auch wenn die angegebene Spalte „By“ numerisch war.
Betreff: So trennen Sie übereinstimmende Werte in einer ListeIch bin einverstanden mit @pmroz Und @txnelson , Datentabellen machen dies einfach.
Ich bevorzuge die Zusammenfassen() Funktion beendet Tabellieren Und Zusammenfassung Dafür allerdings.
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);
Betreff: So trennen Sie übereinstimmende Werte in einer ListeDanke,
Es wäre nützlich, wenn JMP die Funktion „Übereinstimmende Elemente suchen/Übereinstimmende Elemente zurückgeben“ für Listen/assoziative Arrays enthalten würde, wie dies auch für Spalten und Zeilen der Fall ist.
Betreff: So trennen Sie übereinstimmende Werte in einer ListeVergessen Sie nicht, zusammenzufassen.Noch kürzer.
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);
Betreff: So trennen Sie übereinstimmende Werte in einer ListeHier ist meine Variante davon @pmroz Lösung.Es ist eher eine Old-School-Lösung
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 );Betreff: So trennen Sie übereinstimmende Werte in einer ListeTabellenoperationen sind wahrscheinlich der schnellste Weg, dies zu tun.
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);Betreff: So trennen Sie übereinstimmende Werte in einer ListeIch habe es geschafft, mithilfe assoziativer Arrays und der Funktion „<< Schlüssel abrufen“ eine Liste der eindeutigen Werte wie etwa {22, 33} zu erhalten, weiß aber immer noch nicht, wie ich die Anzahl jedes dieser eindeutigen Werte im Original ermitteln kann Liste.