公開日: 04/01/2021

連想配列の応用

連想配列を使用すると、いろいろなタスクをすばやく効率的に実行することができます。

データテーブル列から一意の値を取得する

注: ここで説明している方法は、小数点以下の値を含む列に対しては役立ちません。代わりに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"}

2つの異なるデータテーブルの列を比較する

連想配列を使用すると、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"};

この例では、交差と呼ばれるセット処理を使用しています。連想配列を使用したセット処理で値を比較する方法については、集合演算における連想配列でさらに例が紹介されています。

より詳細な情報が必要な場合や、質問があるときは、JMPユーザーコミュニティで答えを見つけましょう (community.jmp.com).