如何加入並獲取公共匹配列<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我在 JMP 中遇到的問題之一是,當我想在匹配列上使用“Join”函數進行多對多表連接時,結果表中的匹配列總是會得到/在兩個源表之間保持隔離。JMP 似乎沒有提供一種自動或方便的方法來獲取公共匹配列以及為所有行填充的值,無論鍵存在於哪個源表中。它將能夠獲得這種常見的完全填充的匹配列,其中“存在”列指示該鍵是否存在於每個源表中。
讓我用一個例子來說明。假設我有兩張桌子,“藝術課“ 和 ”體育課”。每個表中的“主鍵”是“名“ 和 ”姓氏首字母”。
藝術課:
| 名 | 姓氏首字母 | 最喜歡的顏色 | 分數 |
|---|
| 約翰 | S | 紅色的 | 4 |
| 約翰 | 乙 | 藍色的 | 5 |
| 愛麗絲 | A | 綠色的 | 6 |
| 愛麗絲 | 中號 | 黃色的 | 7 |
| 鮑勃 | S | 紫色的 | 6 |
| 莎莉 | C | 藍色的 | 5 |
體育課:
| 名 | 姓氏首字母 | 最喜歡的活動 | 分數 |
|---|
| 約翰 | S | 猴子酒吧 | 8 |
| 約翰 | A | 鉛球 | 7 |
| 愛麗絲 | 磷 | 足球 | 6 |
| 鮑勃 | S | 籃球 | 5 |
| 莎莉 | C | 曲棍球 | 5 |
| 鮑勃 | 中號 | 仰臥起坐 | 6 |
如果我對匹配列進行聯接,使 FirstName 和 LastInitial 相等,而不刪除多個表並在兩個表中包含不匹配項(“外聯接”),那麼我將獲得以下內容,我們將其稱為“學生1 ”(編輯:如果這些表格中的任何一個被從屏幕上切掉,請原諒我;也許嘗試將其複製到 MS Word 文檔中,因為此網頁的顯示方式。 
學生1:
| 藝術班的名字 | 藝術課的最後一個首字母 | 最喜歡的顏色 | 藝術課成績 | 體操班的名字 | GymClass 的最後一個縮寫 | 最喜歡的活動 | 體操課成績 |
|---|
| | | | 約翰 | A | 鉛球 | 7 |
| | | | 愛麗絲 | 磷 | 足球 | 6 |
| | | | 鮑勃 | 中號 | 仰臥起坐 | 6 |
| 約翰 | S | 紅色的 | 4 | 約翰 | S | 猴子酒吧 | 8 |
| 約翰 | 乙 | 藍色的 | 5 | | | |
| 愛麗絲 | A | 綠色的 | 6 | | | |
| 愛麗絲 | 中號 | 黃色的 | 7 | | | |
| 鮑勃 | S | 紫色的 | 6 | 鮑勃 | S | 籃球 | 5 |
| 莎莉 | C | 藍色的 | 5 | 莎莉 | C | 曲棍球 | 5 |
我更願意得到的是下面這種表格,我們稱之為“學生2 ”:
學生2:
| 名 | 姓氏首字母 | 最喜歡的顏色 | 藝術課成績 | 出席藝術課 | 最喜歡的活動 | 體操課成績 | 出席體操課 |
|---|
| 愛麗絲 | A | 綠色的 | 6 | 1 | | | 0 |
| 愛麗絲 | 中號 | 黃色的 | 7 | 1 | | | 0 |
| 愛麗絲 | 磷 | | | 0 | 足球 | 6 | 1 |
| 鮑勃 | 中號 | | | 0 | 仰臥起坐 | 6 | 1 |
| 鮑勃 | S | 紫色的 | 6 | 1 | 籃球 | 5 | 1 |
| 約翰 | A | | | 0 | 鉛球 | 7 | 1 |
| 約翰 | 乙 | 藍色的 | 5 | 1 | | | 0 |
| 約翰 | S | 紅色的 | 4 | 1 | 猴子酒吧 | 8 | 1 |
| 莎莉 | C | 藍色的 | 5 | 1 | 曲棍球 | 5 | 1 |
請注意,在第二個版本中,我只有一組通用的匹配列——名和姓氏首字母-- 所有行均已完全填充。我還有一些列來告訴我每個源表(ArtClass 和 GymClass)中是否存在該鍵。相反,在第一個版本中(學生1) ,您可以判斷每個源表中是否存在每個鍵的唯一方法是查看隔離的鍵列(“藝術班的名字“/”藝術課的最後一個首字母“,”體操班的名字“/” GymClass 的最後一個縮寫") 缺失或存在。
我設計第二個版本的方式,學生2 ,是通過執行以下迂迴程序:
- 子集或者概括兩個源表中的每一個(藝術課和體育課)通過匹配列,“名“ 和 ”姓氏首字母”。
- 連接#1 中製作的兩個子集表。
- 概括#2 中由匹配列創建的表格 ("名“,”姓氏首字母") 刪除重複項並獲取連接表的唯一鍵;刪除“N Rows”列。
- 在藝術課,暫時添加一個常量列”出席藝術課” 設置為所有。
- 在體育課,暫時添加一個常量列”出席體操課” 設置為所有。
- 在藝術課,暫時改變”分數“ 到 ”藝術課成績”以消除此列與 GymClass 中的列的歧義。
- 在體育課,暫時改變”分數“ 到 ”體操課成績”以消除此欄與 ArtClass 中的欄的歧義。
- 在 #3 中製作的表中,從兩個臨時修改的源表中的每一個進行更新(藝術課和體育課),匹配“名“ 和 ”姓氏首字母”並添加所有列。(2個單獨的操作)
- 在同一個表中,選擇列“出席藝術課“ 和 ”出席體操課“; 做標準化屬性和重新編碼將缺失值改為 0,以便“存在”值為 0 或 1。這是期望的結果,學生2 。
請注意,在這個製作過程中學生2 ,我必須手動隔離衝突的非關鍵柱子, ”分數”,其中加入函數最初是在製作時自動為我完成的學生1 (通過改變每個“分數“ 到 ”分數為... ”),這就是我想要它做的。然而,問題在於加入功能是它為鑰匙列,我不要我希望它這樣做——我希望關鍵列對於整個連接表是通用的,並用單獨的列來標記每個源表中的存在。我上面的過程無法擴展到您的數據可能有更多衝突的非鍵列的情況。
我意識到的唯一替代方法是使用加入功能與以前一樣,但要手動添加公式列每個匹配列這將組合該匹配列的隔離對(例如“名" 將是 " 上的公式列藝術班的名字“ 和 ”體操班的名字"),並且還添加公式列以存在於每個源表中,這些列必須測試與每個源表相對應的所有隔離匹配列是否缺失(例如,"出席藝術課“將是一個關於兩者是否存在的論壇”藝術班的名字“ 和 ”藝術課的最後一個首字母“ 缺失)。這也是一個非常繁瑣、迂迴的過程。
我想知道對於我想做的事情是否有更好、更有效的解決方案——即生成學生2在我的例子中?它會與某種腳本或加載項一起使用嗎?
此外,SAS 是否可能考慮將此類內容作為 JMP 未來的功能擴展?
感謝對此的任何幫助。
回复:如何加入並獲取公共匹配列我認為您已經很好地總結了行為和限制。
我會將它們傳遞給我們的開發人員,看看我們是否可以在未來的版本中進行一些改進。
-傑夫
回复:如何加入並獲取公共匹配列啊,太棒了!(感謝您的快速回复。)我想這在某種程度上就在我眼皮子底下,我不太記得我是否很久以前就嘗試過該複選框並忘記了它的作用。我想說這解決了這個問題的大部分,因為重新編碼“匹配標誌”(例如“ArtClass”/“GymClass”/“Both”)或將其分成兩個單獨的“存在”列(如果需要)非常簡單(就像我在學生2 )。
然而,我想這裡唯一需要注意的是可能需要大量手動重命名列如果有許多類似的非鍵列具有通用名稱,例如“分數“在我的例子中。看起來,如果您不重命名公共非鍵列,那麼顯然結果連接表中的那些列似乎從一個源表或另一個源表中任意獲取值。(也許有一些內部方法可以確定哪一個“獲勝”。)
這樣,“加入“實用性讓我們可以選擇:
(a) 自動消除我們想要的所有內容的歧義,但隔離我們不想要的關鍵列,當我們不選擇“合併相同的列名”,如生成學生1在我的帖子中,或者
(b) 通常組合匹配列並給出一個存在指示列,這是我們想要的,但讓具有通用名稱的非鍵列彼此衝突,這是我們不希望的——當我們做選擇“合併相同的列名稱”。
您知道解決此警告的好方法嗎?
否則,感謝您指出這一點!
回复:如何加入並獲取公共匹配列連接對話框中有一個“合併同名列”選項,顧名思義,它會為您提供一組名和最後首字母列。
在您的示例中,每個表中都有一個名為 Score 的列,因此您需要將它們重命名為體操分數和藝術分數。 完成此操作後,您可以像這樣完成“加入”對話框:

你會得到一個像這樣的數據表:

匹配標誌列指示哪些表對每一行做出了貢獻。 1==主表,2==帶錶,3==兩者。
我認為這就是您正在尋找的東西,或者無論如何都非常接近。
-傑夫