公開日: 09/19/2023

連想配列の応用

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

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

メモ: ここで説明している方法は、小数点以下の値を含む列に対しては役立ちません。代わりにSummarizeを使用してください。詳細については、要約統計量をグローバル変数に格納するを参照してください。

連想配列内では1つのキーを一度しか使用できないため、列の値を連想配列に入れれば自動的に一意の値となります。たとえば、「Big Class.jmp」サンプルデータテーブルには行が40個あります。「身長(インチ)」列に一意の値がいくつあるかを調べるには、次のスクリプトを実行します。

dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
unique heights = Associative Array( dt: "身長(インチ)"n );
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:名前 ) ),
	", 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).