如何加入并获取公共匹配列<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==两者。
我认为这就是您正在寻找的东西,或者无论如何都非常接近。
-杰夫