グループの作成と比較 - 連想配列?おはよう!! 私はこれを理解しようと数週間壁に頭をぶつけてきましたが、アイデアは尽きました。
ビルド リスト上のすべてのプライム/代替品をグループにグループ化して、他のビルド リストの他のすべてのプライム/代替品と比較し、使用されているプライムに基づいて他の部品番号に代替品を追加することを推奨したいと考えています。
サンプルファイルを添付します。 わかりやすくするために、すべてのプライム/代替グループが同じ番号 (つまり 20 または 40) で始まるようにしましたが、最後の桁は異なります。 部品番号の最初のグループは、アセンブリと場所を調べることによって形成でき、共通点がある場合は他のグループにグループを追加します。 連想配列を使用しようとしましたが、それが正しいアプローチかどうかわかりません。
ご協力をよろしくお願いいたします。
Re: グループの作成と比較 - 連想配列?ご意見いただきありがとうございました!この問題を同僚と共有したところ、彼は別のアプローチ、つまり強引なアプローチを思いつきました。
探しているものを実行するスクリプトが添付されています。基本的に、テーブル自体を結合して部品番号をグループに分けてから、assembly_location で再度結合してすべての部品番号を取得します。
いくつかの要約と前後の転置を行った結果、グループ化値でラベル付けされた 1 つの列にすべての Alternate/Prime グループが含まれるリストが得られます。
再度、感謝します!
ブライアン
Re: グループの作成と比較 - 連想配列?@SirBWhiteあなたは興味深い問題を提起していますが、これを行うための洗練された方法があることを期待しています。 ジムさん、 @txnelsonという提案をきっかけに、バブルソートと類似タイプ分析について考えさせられました。これを簡単に行えるテキスト マイニング ソリューションやテキスト距離メトリクスがいくつかあると思います。
Jim との議論に基づいて、データを再編成します。
結果として得られる表 (一部を以下に示します) では、比較可能なアセンブリの選択が大幅に減少します。

このテーブルのグラフィック画像は次のとおりです

これを行うためのスクリプトが添付されています。私がやるべきことは次のとおりです。
- 元の列に「タイプ コード」という列を追加します。タイプ = PRM の場合は 2、タイプ = ALT の場合は 1 になります。
- 次に、テーブル (一時) を分割し、欠落しているものをゼロで再コードします。
- テーブルを並べ替えることもできますが、これは不要です。
部品列が数値列になったこのテーブルは、クラスター アルゴリズムと最近傍アルゴリズムで使用できます。
Re: グループの作成と比較 - 連想配列?ありがとう@txnelson !私はこのアプローチが気に入っていますが、すべてのアセンブリを同じ部品番号で構築できるわけではなく、何千ものアセンブリや部品を調べるのは困難です。おそらく例を単純化しすぎて、その上に非常に複雑な説明を追加しました。
うまくいくと思われるアプローチである程度の進歩を遂げました。すべてのアセンブリの場所とそれに付随する部品番号の連想配列を動的に作成する方法を理解することができました。スクリプトは次のとおりです。
dt=Data Table( "Example" );
//Combine columns to get a single unique identifer for each row
dt << Combine Columns(
delimiter( "_" ),
Columns( :Assembly, :Location ),
Selected Columns are Indicator Columns( 0 ),
Column Name( "Assembly_Location" )
);
//Creates columns for each Assembly_Location - Grouping Like Part numbers together
dt1=dt << Split(
Split By( :Assembly_Location ),
Split( :Part Number ),
Remaining Columns( Drop All ),
Sort by Column Property, <BR /> Table Name ("Transposed Example")
);
//Get all column names as a list
allnames=dt1<<GET column="" names=""></GET>//Create an associative array for every column with the column name used as the array name
for (i = 1, i <= nitems(allnames), i++,
<BR />// If it's a string column then create the column name and an array name for use as a dynamic input
if (is string(allnames[i]),
col_name = "dt1:Name(\!"" || allnames[i]||"\!")" ;
array_name = "aa" || allnames[i];
// Build associative array string dynamically and then execute it.
str = evalinsert(
"\[^array_name^=Associative Array (^col_name^) ;]\");
eval(parse(str));
);
);
aaKBR175_001;<BR />aaKBR175_002;<BR />aaKBR175_003;
ここで、各配列を他の配列と比較して、重複があるかどうかを確認したいと思います。あれば配列を結合したいと思います。 たとえば、KBR175-001 を見ると、 (20-0002、20-0003、20-0004、20-0005)、TRT330-003 (20-0002、20-0003、20-0004)、NTE484-001 (20-0002、20-0003、20-0005) 、20-0007)、KNW995-002(20-0002、20-0003、20-0004、20-0005)。 結果は次のようになります: (20-0002、20-0003、20-0004、20-0005、20-0007)。
intersect 演算を使用できると思いましたが、最初の配列が交差の結果で置き換えられます。
//Creates an Associative Array for each two columns
aa1=Associative Array (dt1:Name("KBR175_001") );
aa3=Associative Array (dt1:Name("NTE484_001") );
//Looks for overlap<BR />aa1 << intersect ( aa3 );
Show(N Items(aa1));
//If there is overlap, it combines the two Arrays into one, otherwise it returns "no"
if (N Items (aa1)>0, aa1<< Insert( aa3 ), Show("no"));しかし、これは、aa1とaa3にaa3を加えたもの、または{"20-0002"、"20-0003"、"20-0005"、"20-0007"}の交差部分のみを提供します。元々あった"20-0004"は除外しました。 aa1の一部。
私の質問は 2 つの部分から構成されています。
1. 配列を比較し、両方の配列を結合してすべてのキーを含める方法はありますか?
2. すべての配列を他のすべての配列と比較するにはどうすればよいですか? ある種のForループがあると思います。
Re: グループの作成と比較 - 連想配列?特定の部品番号にどのアセンブリが使用されていないのかを確認できる、このようなものが必要ですか?

Re: グループの作成と比較 - 連想配列?わかりにくい説明ですみません。 これで少しは明確になると思います。最後に、次のグループを確認したいと思います。{"20-0002", "20-0003", "20-0004", "20-0005", "20- 0007”} を他のすべてのアセンブリと比較できます。 たとえば、部品番号 20-0007 は、KBR175、TRT330、または KNW995 には記載されていないため、代替品として推奨したいと考えています。
Re: グループの作成と比較 - 連想配列?あなたの説明は私にはわかりにくいです。期待される出力の小さなサンプルを提供していただけますか?