リスト内の一致する値を分離する方法こんにちは、
たとえば、{22, 22, 22, 33, 33} を含むリストがあります。 リスト内の各一意の値の数、たとえば 22 の数と 33 の数を取得できるようにしたいと考えています。 問題は、リストの長さがどのくらいになるのか、リスト内に固有の番号が何個含まれるのかがわからないことです。 JSL でこれに対する解決策を一般化する方法はありますか?
ありがとう
自動化とスクリプト作成Re: リスト内の一致する値を区切る方法最後の編集では「my_bigger_list」を「my_list」に変更する必要があると思います。
Re: リスト内の一致する値を区切る方法こんにちは、
心配しないでください、私は問題を解決しました、そしてあなたの解決策は問題の一部ではありませんでした。 ありがとう。
Re: リスト内の一致する値を区切る方法@pmrozさんの返答に興味を持ちました。なぜなら、私は通常、オーバーヘッドのため、できる限りデータテーブルを避けようとしているからです。タイミングを合わせて遊んでみました
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,
)}
),
)
);
そして明らかにそれはリストのサイズに依存します。しかし、さまざまなリストサイズでそれぞれ20回実行したところ、次の結果が得られました

デザインは私が見つけた最も早い方法でした。そして私も間違いなく同意します@txnelson Summarize は常に文字を返すので好きではありません。
Re: リスト内の一致する値を区切る方法私はデザインの大ファンです。
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);
*編集* 並べ替えに時間がかかっていることに気づきました。そのため、これははるかに高速です
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));
*再度編集します (なぜこれがそんなに気になるのかわかりません)* 連想配列が気に入らなかったので、これはまだ高速です
names default to here(1);
my_list = {44, 33, 22, 33, 44};
d = design(my_bigger_list, <<LEVELS></LEVELS>Re: リスト内の一致する値を区切る方法ファイル内の列をループしている場合は、Tabulate または Summary コマンドを使用しないのはなぜでしょうか。別の列でグループ化している場合は、それを「by」変数として使用できます。例えば:
| ID |
価値 |
| あ |
1 |
| あ |
2 |
| あ |
2 |
| B |
2 |
| B |
3 |
| B |
3 |
| B |
4 |
| B |
4 |
tabulate を使用して、ID 列と値列を行のドロップ ゾーンにドラッグします。Value の役割をグループ化変数に変更する必要があります。結果は次のとおりです。
| ID |
価値 |
N |
| あ |
1 |
1 |
| あ |
2 |
2 |
| B |
2 |
1 |
| B |
3 |
2 |
| B |
4 |
2 |
したがって、A には 2 つの異なる値 (1、2) と出現回数 (1、2) があります。B には、3 つの異なる値 (2、3、4) と出現回数 (1、2、2) があります。
同等の 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;Re: リスト内の一致する値を区切る方法データとコードを投稿していただけますか?
Re: リスト内の一致する値を区切る方法こんにちは@pmroz 、
あなたが投稿した最初の解決策を試しましたが、1つのファイル/リストで正常に動作しました。 しかし、コードを関数として使用してループすると、(前の反復からのものが何も保存されていないことを確認するためにすべての変数を初期化したにもかかわらず)、機能していないようです。 ファイルを参照しているのは、ファイル内の列をループして使用されているリストを取得しているためです。 すべてのリストと変数を初期化したので何が起こっているかについて何かアイデアはありますか?
Re: リスト内の一致する値を区切る方法@ジャズ、
これは、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);
Re: リスト内の一致する値を区切る方法この提案をコミュニティのウィッシュリストエリアに投稿してください。
Re: リスト内の一致する値を区切る方法要約プラットフォームに対する私のサポートは、グループ化変数が、元のデータ テーブルにあるものと同じデータ型として要約データ テーブル内で維持されることです。Summarize() 関数では、指定された By 列が数値であっても、常に文字値として返されます。
Re: リスト内の一致する値を区切る方法同意する@pmrozそして@txnelson 、データ テーブルを使用すると、これが簡単になります。
私は要約()機能終了表にするそしてまとめただしこれに関しては。
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);
Re: リスト内の一致する値を区切る方法ありがとう、
JMP に、列と行の場合と同様に、リスト/連想配列に対して一致する項目を検索/一致する項目を返す機能が含まれていれば便利です。
Re: リスト内の一致する値を区切る方法まとめを忘れずに。さらに短い。
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);
Re: リスト内の一致する値を区切る方法これが私のバリエーションです@pmroz解決。それはむしろ昔ながらの解決策です
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 );Re: リスト内の一致する値を区切る方法おそらくテーブル操作がこれを行う最も速い方法です。
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);Re: リスト内の一致する値を区切る方法連想配列と << キー取得機能を使用して、{22, 33} のような一意の値のリストを取得することができましたが、元の各一意の値の数を取得する方法がまだわかりません。リスト。