创建新的ID以处理多对多关系嗨,我有两列数据,一列是个人ID,一列是电子邮件。 此数据的问题在于,单个ID和电子邮件之间的关系是多对多的,这意味着一个单个ID可以具有多个电子邮件,而一个电子邮件可以具有多个单个ID。 因此,我需要创建一个新的唯一ID到所有personalID / email的映射表,该表指定那些单独的id或电子邮件(如果有重叠)实际上是同一个人。 我真的想不出没有脚本就能做到的方法。 有人可以帮忙吗? 谢谢!
分析工具回复:创建新的ID以处理多对多关系那么,从哪里可以得到告诉您唯一身份号码的唯一号码的信息呢? 您仅基于这两列来描述,您别无选择,只能使其中一列成为唯一标识符并将另一列映射到该唯一标识符。 也许发布一些示例数据?
回复:创建新的ID以处理多对多关系我不明白你想要什么。听起来您可以将两列连接起来,并且每个观察结果都有唯一的个人/电子邮件组合。如果您希望每个人或每封电子邮件都在其自己的行中,只需使用制表。我附加了一个示例表,该表显示了多重映射,带有制表符以及带有唯一标识符的新列。也许您可以使用此示例来告诉我们您想要什么。
回复:创建新的ID以处理多对多关系我认为需要的是一个像这样的表:
从一个看起来像这样的表中:
| ID | 电子邮件 |
| 10 | ... |
| 11 | ... |
| 12 | .. |
| 15 | .. |
| 16 | .. |
| 17 | .. |
| 18岁 | .. |
但是我不清楚您怎么知道哪个ID和哪个电子邮件属于同一个人,所以这就是我的问题。
回复:创建新的ID以处理多对多关系我认为您可以通过制表(如我的示例),然后将其放入数据表,然后创建一个串联的列(如果要插入“,”,则将多个串联)来做到这一点。
回复:创建新的ID以处理多对多关系嗨,保罗! 我更新了原始帖子中的信息。 请检查一下,谢谢!回复:创建新的ID以处理多对多关系嗨,戴尔! 我更新了原始帖子中的信息。 请检查一下,谢谢!回复:创建新的ID以处理多对多关系我认为您需要有人编写此脚本。我尝试了多种方法,但似乎无法获得任何有效的方法-涉及到许多步骤,因此似乎不值得。但是,我确实发现情况有些奇怪-常见的情况是,您有多个电子邮件地址的人,但也有多个使用相同电子邮件地址的人。但是,您想确定唯一的人-我不明白为什么您会说两个共享同一电子邮件地址的人实际上只是一个人?在您的示例中,您似乎想将ID为2的人排除为唯一的人,因为他们与他人共享电子邮件地址。但是,为什么这意味着他们不是一个独特的人呢?您是否可能使此问题变得不必要的复杂?我倾向于只关注唯一的ID,然后想要一个与它们相关联的电子邮件地址列表,这是一个简单的制表功能。
回复:创建新的ID以处理多对多关系这肯定看起来有点怪异的方式@dale_lehman说。 您可以至少使用递归来编写脚本。 下面是非常混乱的示例代码,似乎至少可以与我的示例数据一起使用(如果我正确理解了这个想法):
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(20),
Compress File When Saved(1),
New Column("id",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([1, 1, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 7, 8, 9])
),
New Column("email",
Character,
"Nominal",
Set Values(
{"a", "b", "a", "c", "d", "e", "f", "g", "a", "h", "i", "j", "k", "l",
"m", "n", "o", "p", "q", "b"}
)
)
);
dt << Size Window(500,900);
dt << New Column("newid", numeric, ordinal);
createIndex = function({tempRows, index},
wait(0.5); //for visualization
idList = dt:id[tempRows,0];
emailList = dt:email[tempRows,0];
tempRowsNew = dt << Get Rows Where(Contains(idList, :id) | Contains(emailList, :email));
dt << Select Where(Contains(idList, :id) | Contains(emailList, :email)); //for visualization
wait(0.5); //for visualization
If(N Items(tempRows) != N Items(tempRowsNew),
ids = dt:id[tempRowsNew,0];
emails = dt:email[tempRowsNew,0];
Recurse(tempRowsNew, index),
If(All(tempRows == tempRowsNew),
dt:newId[tempRowsNew] = index;
newRow = Contains(dt:newId << get as matrix, .);
If(newRow == 0,
dt << Clear Select;
return("done"),
ids = dt:id[newRow,0];
emails = dt:email[newRow,0];
Recurse(matrix(newRow), index + 1);
);
)
);
);
wait(1);
createIndex([1], 1);我在函数内部添加了额外的“选择位置并等待”,以尝试显示正在发生的情况。
回复:创建新的ID以处理多对多关系谢谢戴尔! 是的,这是有道理的,但是对于此业务案例,我们决定将具有相同电子邮件的人视为一个人,以计算其其他行为的顺序。回复:创建新的ID以处理多对多关系非常感谢Jarmo! 从您的脚本中得出的结果正是我所需要的。 我不熟悉脚本,因此仅是以下一个有关如何将其应用到当前表中的问题。两个列的名称分别是“ Individualid”和“ Email_HASHED”,我将下面编辑的脚本粘贴到了表中,但是显示错误。你能帮我调试吗? 谢谢!
New Column("newid", numeric, ordinal);
createIndex = function({tempRows, index},
wait(0.5); //for visualization
idList = Individualid[tempRows,0];
emailList = Email_HASHED[tempRows,0];
tempRowsNew = Get Rows Where(Contains(idList, :Individualid) | Contains(emailList, :Email_HASHED));
Select Where(Contains(idList, :Individualid) | Contains(emailList, :Email_HASHED)); //for visualization
wait(0.5); //for visualization
If(N Items(tempRows) != N Items(tempRowsNew),
ids = Individualid[tempRowsNew,0];
emails = Email_HASHED[tempRowsNew,0];
Recurse(tempRowsNew, index),
If(All(tempRows == tempRowsNew),
newId[tempRowsNew] = index;
newRow = Contains(newId << get as matrix, .);
If(newRow == 0,
Clear Select;
return("done"),
ids = Individualid[newRow,0];
emails = Email_HASHED[newRow,0];
Recurse(matrix(newRow), index + 1);
);
)
);
);
wait(1);
createIndex([1], 1);
回复:创建新的ID以处理多对多关系我对脚本进行了一些修改(将递归更改为while循环,因为有时可能很难理解递归)。 还更改了列名。
Names Default To Here(1);
//https://community.jmp.com/t5/Discussions/create-new-id-to-deal-with-multiple-to-multiple-relationship/m-p/365298#M61470
dt = New Table("Untitled",
Add Rows(20),
Compress File When Saved(1),
New Column("Individualid",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([1, 1, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 7, 8, 9])
),
New Column("Email_HASHED",
Character,
"Nominal",
Set Values(
{"a", "b", "a", "c", "d", "e", "f", "g", "a", "h", "i", "j", "k", "l",
"m", "n", "o", "p", "q", "b"}
)
)
);
dt << Size Window(500,900);
dt << New Column("newid", numeric, ordinal);
//setup first values before While loop
rowList = [1];
idList = dt:Individualid[rowList,0];
emailList = dt:Email_HASHED[rowList,0];
index = 1;
//looping
While(1,
oldRowList = rowList;
rowList = dt << Get Rows Where(Contains(idList, :Individualid) | Contains(emailList, :Email_HASHED));
dt << Select Where(Contains(idList, :Individualid) | Contains(emailList, :Email_HASHED)); //for visualization
wait(1); //for visualization
If(N Items(oldRowList) != N Items(rowList),
idList = dt:Individualid[rowList,0];
emailList = dt:Email_HASHED[rowList,0],
If(All(oldRowList == rowList),
dt:newid[rowList] = index;
newRow = Contains(dt:newid << get as matrix, .);
If(newRow == 0,
break(),
);
index += 1;
rowList = Matrix(newRow);
idList = dt:Individualid[rowList,0];
emailList = dt:Email_HASHED[rowList,0];
);
);
);您似乎已从修改后的版本中删除了dt引用,这可能会导致问题。
回复:创建新的ID以处理多对多关系谢谢Jarmo! 如何将dt更改为当前数据表,而不用放入的样本创建新表?回复:创建新的ID以处理多对多关系dt = current data table();
或者
dt = Data table("Name of table here")