共通の一致する列を結合して取得する方法<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />JMP で苦労していることの 1 つは、一致する列に対して「Join」関数を使用して多対多のテーブル結合を実行したい場合、結果のテーブル内の一致する列が常に取得されてしまうという事実です。 / 2 つのソース テーブルのそれぞれの間で分離されたままになります。JMP は、キーがどのソース テーブルに存在したかに関係なく、すべての行に値が入力された共通の一致列を取得する自動または便利な方法を提供していないようです。そのキーが各ソース テーブルに存在するかどうかを示す「存在」列を使用して、このような一般的な完全に入力された一致列を取得できます。
例を挙げて説明しましょう。2 つのテーブルがあるとします。」アートクラス" そして "体育」。各テーブルの「主キー」は「」の組み合わせです。ファーストネーム" そして "最後のイニシャル」。
アートクラス:
| ファーストネーム | 最後のイニシャル | 好きな色 | スコア |
|---|
| ジョン | S | 赤 | 4 |
| ジョン | B | 青 | 5 |
| アリス | あ | 緑 | 6 |
| アリス | M | 黄色 | 7 |
| ボブ | S | 紫 | 6 |
| サリー | C | 青 | 5 |
体育:
| ファーストネーム | 最後のイニシャル | お気に入りの科目 | スコア |
|---|
| ジョン | S | モンキーバー | 8 |
| ジョン | あ | 砲丸投 | 7 |
| アリス | P | サッカー | 6 |
| ボブ | S | バスケットボール | 5 |
| サリー | C | フィールドホッケー | 5 |
| ボブ | M | クランチ | 6 |
一致する列で結合を実行し、FirstName と LastInitial を同等にし、複数を削除せず、両方のテーブルに一致しないものを含めると (「外部結合」)、次の結果が得られます。これを「」と呼びます。学生1 " (編集: これらのテーブルのいずれかが画面から切れてしまっている場合は、ご容赦ください。この Web ページの表示方法を考慮して、これを MS Word 文書にコピーしてみてください。 
生徒1:
| アートクラスの名 | ArtClass の最後のイニシャル | 好きな色 | ArtClass のスコア | 体育クラスの名 | GymClass の最後のイニシャル | お気に入りの科目 | 体育授業のスコア |
|---|
| | | | ジョン | あ | 砲丸投 | 7 |
| | | | アリス | P | サッカー | 6 |
| | | | ボブ | M | クランチ | 6 |
| ジョン | S | 赤 | 4 | ジョン | S | モンキーバー | 8 |
| ジョン | B | 青 | 5 | | | |
| アリス | あ | 緑 | 6 | | | |
| アリス | M | 黄色 | 7 | | | |
| ボブ | S | 紫 | 6 | ボブ | S | バスケットボール | 5 |
| サリー | C | 青 | 5 | サリー | C | フィールドホッケー | 5 |
私がむしろ取得したいのは、次のような種類のテーブルです。これを「」と呼びます。学生2 ":
学生2:
| ファーストネーム | 最後のイニシャル | 好きな色 | ArtClass のスコア | アートクラスでの発表 | お気に入りの科目 | 体育授業のスコア | 体育の授業でのプレゼン |
|---|
| アリス | あ | 緑 | 6 | 1 | | | 0 |
| アリス | M | 黄色 | 7 | 1 | | | 0 |
| アリス | P | | | 0 | サッカー | 6 | 1 |
| ボブ | M | | | 0 | クランチ | 6 | 1 |
| ボブ | S | 紫 | 6 | 1 | バスケットボール | 5 | 1 |
| ジョン | あ | | | 0 | 砲丸投 | 7 | 1 |
| ジョン | B | 青 | 5 | 1 | | | 0 |
| ジョン | S | 赤 | 4 | 1 | モンキーバー | 8 | 1 |
| サリー | C | 青 | 5 | 1 | フィールドホッケー | 5 | 1 |
2 番目のバージョンでは、一致する列の共通セットが 1 つだけであることに注目してください --ファーストネームそして最後のイニシャル-- すべての行に完全に入力されます。また、キーが各ソース テーブル (ArtClass と GymClass) に存在するかどうかを示す列もあります。対照的に、最初のバージョンでは (学生1)各キーが各ソース テーブルに存在するかどうかを確認できる唯一の方法は、分離されたキー列 ("アートクラスの名「/」 ArtClass の最後のイニシャル"、"体育クラスの名「/」 GymClass の最後のイニシャル") が存在しないか、存在します。
私が第二版を考案した方法としては、学生2 、次のような回りくどい手順を実行することでした。
- サブセットまたはまとめ2 つのソース テーブルのそれぞれ (アートクラスそして体育) 一致列ごとに、"ファーストネーム" そして "最後のイニシャル」。
- 連結する#1 で作成した 2 つのサブセット テーブル。
- まとめ#2 で一致列によって作成されたテーブル ("ファーストネーム"、"最後のイニシャル") 重複を削除し、結合されたテーブルの一意のキーを取得するには、"N Rows" 列を削除します。
- でアートクラス、一時的に定数列を追加します。アートクラスでの発表" すべて 1 に設定します。
- で体育、一時的に定数列を追加します。体育の授業でのプレゼン" すべて 1 に設定します。
- でアートクラス、一時的に変更します」スコア" に " ArtClass のスコア" を使用して、この列を GymClass の列と区別します。
- で体育、一時的に変更します」スコア" に "体育授業のスコア" を使用して、この列を ArtClass の列と区別します。
- #3で作成したテーブルで、一時的に変更した2つのソーステーブルのそれぞれから更新します(アートクラスそして体育)、「」に一致しますファーストネーム" そして "最後のイニシャル" そしてすべての列を追加します。(2 つの別々の操作)
- 同じテーブルで、列を選択します。アートクラスでの発表" そして "体育の授業でのプレゼン"; する属性の標準化そして再コード化欠損値は代わりに 0 になり、「存在」値は 0 または 1 になります。これは望ましい結果です。学生2 。
なお、この作成手順では、学生2 、競合するものを手動で分離する必要がありました。非キーカラム、 "スコア」、それは参加する関数はもともと作成時に自動的に行われていました学生1 (それぞれを変更することで、スコア" に "のスコア... ")、これが私がやりたかったことです。ただし、問題は、参加する機能は、同じことを行うことです。鍵コラム、私はしないでくださいそうしたい -- キー列を結合テーブル全体で共通にし、各ソーステーブルに存在することを示す個別の列を持たせたいと考えています。上記の手順は、データに競合する非キー列がさらに多く存在する可能性がある状況には拡張できません。
私が気づいた唯一の代替方法は、参加する以前と同様に機能しますが、数式列を手動で追加します。すべての一致列これは、その一致列の分離されたペアを結合します (例: "ファーストネーム" は " の数式列になりますアートクラスの名" そして "体育クラスの名")、また、各ソース テーブルに対応する分離された一致列がすべて欠落しているかどうかをテストする必要がある式列を各ソース テーブルに追加します (たとえば、"アートクラスでの発表" は両方とも " であるかどうかの式になります。アートクラスの名" そして " ArtClass の最後のイニシャル"が欠落しています)。これも非常に面倒で回りくどいプロセスです。
私がやろうとしていること、つまり、学生2私の例では?何らかのスクリプトやアドインを使用するのでしょうか?
さらに、SAS は将来の JMP の機能拡張としてこのようなものを検討する可能性はありますか?
ご協力をよろしくお願いいたします。
Re: 共通の一致する列を結合して取得する方法動作と制限についてはよくまとめられていると思います。
それらを開発スタッフに渡して、将来のリリースで改善できるかどうかを確認します。
-ジェフ
Re: 共通の一致する列を結合して取得する方法ああ、素晴らしい!(素早い返答に感謝します。) それはある意味、私の目と鼻の先にあったのだと思います。ずっと前にそのチェックボックスを試してみて、その機能を忘れていたかどうか、まったく思い出せません。これでこの問題の大部分は解決すると思います。なぜなら、「Match Flag」を再コード化する(たとえば、「ArtClass」/「GymClass」/「両方」に)か、必要に応じて 2 つの別々の「存在」列に分割するのが非常に簡単だからです。 (私が持っていたように学生2 )。
ただし、ここで唯一の注意点があると思います。手動による列名の変更が多数必要になる可能性があります「」のような一般的な名前を持つ類似の非キー列が多数ある場合スコア」私の例では。共通の非キー列の名前を変更しない場合、結果の結合テーブル内のそれらの列は、どちらかのソース テーブルから任意に値を取得するようです。(おそらく、どちらが「勝つ」かについては、何らかの内部的な方法があるのでしょう。)
このようにして、「参加する" ユーティリティでは、次のいずれかの選択肢が与えられます。
(a) 必要なものはすべて自動的に曖昧さを解消しますが、必要のないキー列は分離します。しないでください生成の場合と同様に、「同じ列名を結合」を選択します。学生1私の投稿で、または
(b) 一致する列を一般的に結合し、存在を示す列を指定します。これは必要ですが、共通名の非キー列が互いに競合することは望ましくありません。する「同じ列名を結合」を選択します。
この警告に対する良い回避策をご存知ですか?
それ以外の場合は、ご指摘いただきありがとうございます。
Re: 共通の一致する列を結合して取得する方法結合ダイアログには「同じ名前の列を結合」オプションがあり、その名前が示すように、1 つのセットを取得します。ファーストネームそして最後のイニシャル列。
この例では、各テーブルに Score という名前の列があるため、それらの名前を次のように変更する必要があります。ジムスコアそしてアートスコア。 それを行った後、次のように [参加] ダイアログを完了できます。

そして、次のようなデータテーブルが得られます。

「一致フラグ」列は、どのテーブルが各行に寄与したかを示します。 1==メインテーブル、2==テーブル付き、3==両方。
それがあなたが探しているもの、あるいはそれに非常に近いものだと思います。
-ジェフ