創建新的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")