連想配列を使用すると、いろいろなタスクをすばやく効率的に実行することができます。
注: ここで説明している方法は、小数点以下の値を含む列に対しては役立ちません。代わりにSummarizeを使用してください。詳細については、要約統計量をグローバル変数に格納するを参照してください。
連想配列内では1つのキーを一度しか使用できないため、列の値を連想配列に入れれば自動的に一意の値となります。たとえば、「Big Class.jmp」サンプルデータテーブルには行が40個あります。「身長(インチ)」列に一意の値がいくつあるかを調べるには、次のスクリプトを実行します。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
unique heights = Associative Array( dt:Name("身長(インチ)") );
nitems( unique heights );
17
「身長(インチ)」の一意の値は17個しかありません。キーを取得することで、これらの一意の値を使用できます。
unique heights << Get Keys;
{51, 52, 55, 56, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70}
注: これが可能なのは、JMPでは、文字列だけではなくあらゆるデータタイプが連想配列のキーとして使用できるためです。
連想配列を使えば、列内の一意の値を簡単に効率的に見つけることができます。次のスクリプトは、100,000行もあるデータテーブルを作成するので時間がかかります。しかし39個の一意の値を探す作業はほとんど時間がかかりません。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
nms = dt:name << Get Values;
dtbig = New Table( "Really Big Class",
New Column( "名前",
Character,
Set Values( nms[J( 100000, 1, Random Integer( N Items( nms ) ) )] )
)
);
Wait( 0 );
t1 = Tick Seconds();
Write(
"\!N# names from Really Big Class = ",
N Items( Associative Array( dtbig:name ) ),
", elapsed time=",
Tick Seconds() - t1
);
# names from Really Big Class = 39, elapsed time=0.116666666639503
キーは文字コード順に並べられるため、連想配列に値を入れれば、値が文字コード順に並べ替えられます。
たとえば、<<Get Keysメッセージはキー(「名前」列の一意の値)を昇順で戻します。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
unique names = Associative Array( dt:名前 );
unique names << Get Keys;
{"ALFRED", "ALICE", "AMY", "BARBARA", "CAROL", "CHRIS", "CLAY", "DANNY", "DAVID", "EDWARD", "ELIZABETH", "FREDERICK", "HENRY", "JACLYN", "JAMES", "JANE", "JEFFREY", "JOE", "JOHN", "JUDY", "KATIE", "KIRK", "LAWRENCE", "LESLIE", "LEWIS", "LILLIE", "LINDA", "LOUISE", "MARION", "MARK", "MARTHA", "MARY", "MICHAEL", "PATTY", "PHILLIP", "ROBERT", "SUSAN", "TIM", "WILLIAM"}
連想配列を使用すると、1つの列のどの値が別の列にないか(またはどの値が両方の列にあるか)を簡単に調べることができます。たとえば、国に関するデータテーブルが2つあり、どの国が両方のデータテーブルに記載されているかを調べたいとします。
各データテーブルの国名が含まれている列から連想配列を作成します。
dt1 = Open( "$SAMPLE_DATA/BirthDeathYear.jmp" );
dt2 = Open( "$SAMPLE_DATA/World Demographics.jmp" );
aa1 = Associative Array( dt1:国 );
aa2 = Associative Array( dt2:国 );
N Items()を使用して、各データテーブルに出現する国の数を調べます。
N Items(aa1);
23
N Items(aa2);
239
<<Intersectメッセージを使用して、共通の値を調べます。
aa1 = Associative Array( dt1:国 );
aa1 << Intersect( aa2 );
結果を表示します。
Show(N Items(aa1), aa1 << Get Keys);
N Items(aa1) = 21;
aa1 << get keys = {"Australia", "Austria", "Belgium", "France", "Greece", "Ireland", "Israel", "Italy", "Japan", "Mauritius", "Netherlands", "New Zealand", "Norway", "Panama", "Poland", "Portugal", "Romania", "Switzerland", "Tunisia", "United Kingdom", "United States"};
この例では、交差と呼ばれるセット処理を使用しています。連想配列を使用したセット処理で値を比較する方法については、集合演算における連想配列でさらに例が紹介されています。