問題
問題 1: データ テーブル列の一意の値のリストを取得する必要があります。
問題 2: JSL データ構造内の一意の値のリスト (リストまたは行列) を取得する必要がある
解決
問題 1 の場合:
解決策 1:要約テーブルを使用します。以下の JSL は、 Summary() を使用して、単一の列にそれぞれの一意の値を含む行を持つテーブルを取得する方法を示しています。その後、さらに JSL テーブル コマンドを実行して、サマリー テーブルからこれらの値を取得できます。
_dt = Open( "$sample_data/big class.jmp" );
//create a summary table of the :sex column
_dt1 = _dt << Summary(
Group( :sex ),
Freq( "None" ),
Weight( "None" )
);
//create a summary table of the :age column
_dt2 = _dt << Summary(
Group( :age ),
Freq( "None" ),
Weight( "None" )
);
<SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2-13-2018 5-22-08 PM.png" style="width: 280px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="2-13-2018 5-22-08 PM.png" style="width: 280px;"><span class="lia-inline-image-display-wrapper" image-alt="2-13-2018 5-22-08 PM.png" style="width: 280px;"><img src="https://us.v-cdn.net/6038925/uploads/images/9328i5A075F342798D202/2-13-2018%205-22-08%20PM.png" role="button" title="2-13-2018 5-22-08 PM.png" alt="2-13-2018 5-22-08 PM.png" /></span></SPAN></SPAN>
問題 2:
これで、データ テーブルの代わりに JMP リストまたはマトリックスが作成されました。
sexlist = {"F", "M", "M", "F", "F", "M", "M", "F", "M"};
agelist = [14, 11, 12, 13, 15, 17, 15, 11, 12];これを行う複雑な方法は次のとおりです。
a) リストの値を新しいデータ テーブル列に入力し、要約アプローチを使用します。または、
b) 一意の値を検索して記録するために、やや複雑な for ループを作成します。
幸いなことに、連想配列を使用するより簡単な方法があります。
Associative Array(sexlist) << Get Keys;
Associative Array(agelist) << Get Keys;
それぞれ {"F"、"M"}、および {11、12、13、14、15、17} を返します (これらは適切に並べ替えられたリストであることに注意してください)。数値を並べ替えられたベクトルとして取得したい場合は、次のように使用できます。
Matrix(Associative Array(agelist) << Get Keys);
これは [11、12、13、14、15、17] を返します。
このアプローチは、問題 1 の解決策 1 の代わりに使用することもできます。
問題 1、解決策 2:Associative Array(Column(_dt, "sex") << Get Values) << Get Keys;<BR />Matrix(Associative Array(Column(_dt, "age")<< Get Values)<<GET keys=""></GET>
戻り値それぞれ {"F"、"M"} および [11、12、13、14、15、17]。 これが何をしているかというと、
- 指定された列から値をリスト (列が文字の場合) または行列 (列が数値の場合) として取得します。
- そのリストまたは行列を連想配列に変換します
- 連想配列のキーを取得します。この場合、キーは列内の値の一意のレベルであり、それをリストとして返します。
- (結果のリストで Matrix() が使用される場合、リスト内の値がすべて数値である場合にのみ機能します)。
Summarize() は連想配列よりもはるかに効率的であり、200 万行のデータ (1 秒対 8 秒のタイムラプス) を使用すると非常に明白です。 パフォーマンスが重要な場合は、可能な限り Summarize() を使用してください。
Summarize( dt, smrz1 = by( :sex ) ); Summarize( dt, smrz2 = by( :age ) );
* Summarize() は中間データテーブルを << Summary として作成しません
連想配列は、リスト/行列をデータ テーブルに配置する手間を省くという点で優れており、小さなデータ サイズには最適なソリューションです。