Erstellen Sie eine neue ID, um mit Mehrfach-zu-Mehrfach-Beziehungen umzugehen*Aktualisieren
Tut mir leid, ich sollte die Frage klarer formulieren. Die Daten, die ich derzeit habe, sehen so aus:
ID-E-Mail
1 a
1 b
2 a
2 c
3 T
Wir können sehen, dass es sich bei id 1 2 und email abc tatsächlich um dieselbe Person handelt, da sich die Informationen überschneiden.
Was ich hier versuche, ist, eine Match-Tabelle mit einem neuen Schlüssel zu erstellen, den ich verwenden kann, um mit der ursprünglichen Tabelle abzugleichen, um festzustellen, ob es sich bei den überlappenden Personen tatsächlich um dieselbe Person handelt:
newID-ID/E-Mail
111 1
111 2
111 a
111 v
111 Jh
222 d
Die neue ID muss nicht in einer bestimmten Form vorliegen, sie kann sogar der ursprünglichen ID entsprechen, solange wir sie zur Identifizierung einer „einzigartigen Person“ verwenden können.
-------------------------------------
Hallo, ich habe Daten mit zwei Spalten, eine ist die individuelle ID und die andere ist die E-Mail. Das Problem bei diesen Daten besteht darin, dass die Beziehung zwischen individueller ID und E-Mail mehrfach ist, was bedeutet, dass eine einzelne ID mehrere E-Mails und eine E-Mail mehrere individuelle IDs haben kann. Daher müsste ich eine Zuordnungstabelle einer neuen eindeutigen ID für alle individuellen IDs/E-Mail-Adressen erstellen, die angibt, dass es sich bei diesen einzelnen IDs oder E-Mails, falls es Überschneidungen gibt, tatsächlich um dieselbe Person handelt. Mir fiel nicht wirklich eine Möglichkeit ein, es ohne Skript zu machen. Könnte jemand helfen? Danke schön!
Datenmischung und -bereinigungQualitäts- und VerfahrenstechnikBetreff: Erstellen Sie eine neue ID, um mit Mehrfach-zu-Mehrfach-Beziehungen umzugehenVielen Dank, Jarmo! Es klappt!!Betreff: Erstellen Sie eine neue ID, um mit Mehrfach-zu-Mehrfach-Beziehungen umzugehenIch habe falsch gelesen/verstanden, wie Sie mit den fehlenden Werten umgehen wollten. Sie wollen für jeden von ihnen einen einzigartigen Wert haben, oder? Da fehlende Werte zuletzt behandelt werden, können Sie die letzten Zeilen nach //handlemissing einfach mit dem folgenden Skript ersetzen:
//handle missings
For Each Row(dt,
If(IsMissing(:newid),
index++;
dt:newId = index;
);
);
</CODE></P></LINGO-BODY><LINGO-SUB id="lingo-sub-366610" slang="en-US" mode="NONE">Betreff: Erstellen Sie eine neue ID, um mit Mehrfach-zu-Mehrfach-Beziehungen umzugehen</LINGO-SUB><LINGO-BODY id="lingo-body-366610" slang="en-US" mode="NONE"><P>Hallo Jarmo, das Ergebnis scheint das gleiche zu sein wie das vorherige, siehe beigefügter Screenshot. Die „newid1“ ist diejenige, die das vorherige Skript verwendet, und die „newid“ ist diejenige, die Ihr neuestes Skript verwendet, das genau wie das vorherige den verschiedenen individuellen IDs mit leerer E-Mail dieselbe neue ID „750“ zugewiesen hat. Könnten Sie das bitte überprüfen? Danke schön!</P><P> </P><P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screen Shot 2021-03-09 at 3.56.12 PM.png" style="width: 143px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="Screen Shot 2021-03-09 at 3.56.12 PM.png" style="width: 143px;"><span class="lia-inline-image-display-wrapper" image-alt="Screen Shot 2021-03-09 at 3.56.12 PM.png" style="width: 143px;"><img src="https://us.v-cdn.net/6038925/uploads/images/31129i40283FF98CA6E0FA/Screen%20Shot%202021-03-09%20at%203.56.12%20PM.png" role="button" title="Screen Shot 2021-03-09 at 3.56.12 PM.png" alt="Screen Shot 2021-03-09 at 3.56.12 PM.png" /></span></SPAN></SPAN></P></LINGO-BODY><LINGO-SUB id="lingo-sub-366510" slang="en-US" mode="NONE">Betreff: Erstellen Sie eine neue ID, um mit Mehrfach-zu-Mehrfach-Beziehungen umzugehen</LINGO-SUB><LINGO-BODY id="lingo-body-366510" slang="en-US" mode="NONE"><P>Ihre Ergebnisse konnten nicht reproduziert werden (höchstwahrscheinlich haben Sie unterschiedliche individuelle IDs, beginnend mit 308...)</P><P> </P><P>Sieht das Ergebnis hieraus korrekt aus?</P><PRE><CODE class=" language-jsl">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 = New Table("Untitled",
Add Rows(19),
Compress File When Saved(1),
New Column("Individualid",
Numeric,
"Continuous",
Format("Best", 12),
Set Values(
[139, 100, 229, 301, 308, 284, 682, 136, 586, 256, 122, 711, 629, 116,
152, 443, 301, 695, 311]
)
),
New Column("Email_HASHED",
Character,
"Nominal",
Set Values(
{"A648", "CAA", "E7B", "5B2", "", "237A", "", "FE0", "", "7C21", "",
"920B", "", "D394", "", "2FE1", "", "", ""}
)
)
);
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;
Remove From(emailList, Contains(emailList, ""));
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, .);
newRow = 0;
For Each Row(dt,
If(:Email_HASHED != "" & IsMissing(:newId),
newRow = Row();
break();
)
);
If(newRow == 0,
break(),
);
index += 1;
rowList = Matrix(newRow);
idList = dt:Individualid[rowList,0];
emailList = dt:Email_HASHED[rowList,0];
);
);
);
//dt << Clear Select;
//handle missings
index++;
missingRows = dt << Get Rows Where(IsMissing(:newId));
dt:newId[missingRows] = index
Betreff: Erstellen Sie eine neue ID, um mit Mehrfach-zu-Mehrfach-Beziehungen umzugehenHallo Jarmo, unten ist ein Beispiel. Sie können sehen, dass viele Zeilen mit leeren E-Mail-Adressen alle als neue ID 5 gruppiert sind. Wenn sich die individuelle ID nicht mit anderen Gruppen überschneidet, sollten diejenigen ohne E-Mail-Adresse jeweils ihre eigene neue ID haben. Danke schön!

Betreff: Erstellen Sie eine neue ID, um mit Mehrfach-zu-Mehrfach-Beziehungen umzugehenWie soll mit ihnen umgegangen werden? Höchstwahrscheinlich handelt es sich um eine oder zwei if-Anweisungen.
Ein kleiner Beispieldatensatz mit richtigen Antworten könnte helfen.
Betreff: Erstellen Sie eine neue ID, um mit Mehrfach-zu-Mehrfach-Beziehungen umzugehenHallo Jarmo, ich habe vergessen zu erwähnen, dass es in der E-Mail-Spalte einige Zeilen mit leeren Zellen gibt, was bedeutet, dass in der E-Mail-Spalte für einige Personen-IDs nichts ausgefüllt ist. Ich habe festgestellt, dass das aktuelle Skript alle individuellen IDs ohne E-Mail-Adresse als dieselbe neue ID betrachtet. Könnten Sie helfen, das Skript anzupassen, um eine solche Situation zu vermeiden? Danke schön!Betreff: Erstellen Sie eine neue ID, um mit Mehrfach-zu-Mehrfach-Beziehungen umzugehenVielen Dank, Jarmo! Es klappt!! Schätze wirklich deine Hilfe.Betreff: Erstellen Sie eine neue ID, um mit Mehrfach-zu-Mehrfach-Beziehungen umzugehenUnd je nachdem, wie Sie die Datentabelle erhalten, können Sie direkt darauf verweisen:
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt1 = dt << Subset(All rows);
dt2 = Query(dt, "SELECT name, age, height FROM 'Big Class' WHERE age > 14; ");usw
Betreff: Erstellen Sie eine neue ID, um mit Mehrfach-zu-Mehrfach-Beziehungen umzugehendt = current data table();
oder
dt = Data table("Name of table here")Betreff: Erstellen Sie eine neue ID, um mit Mehrfach-zu-Mehrfach-Beziehungen umzugehenDanke Jarmo! Wie ändere ich den dt in meine aktuelle Datentabelle, erstelle aber keine neue Tabelle mit den von Ihnen eingegebenen Beispielen?Betreff: Erstellen Sie eine neue ID, um mit Mehrfach-zu-Mehrfach-Beziehungen umzugehenIch habe das Skript ein wenig modifiziert (die Rekursion wurde in eine While-Schleife geändert, da die Rekursion von Zeit zu Zeit etwas schwierig zu verstehen sein kann). Außerdem wurden die Spaltennamen geändert.
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];
);
);
);Sie haben gesehen, dass Sie die dt-Verweise aus Ihrer geänderten Version entfernt haben, was zu Problemen führen könnte.
Betreff: Erstellen Sie eine neue ID, um mit Mehrfach-zu-Mehrfach-Beziehungen umzugehenVielen Dank, Jarmo! Dieses Ergebnis Ihres Skripts ist genau das, was ich brauche. Ich bin mit Skripten nicht vertraut, daher nur eine Frage, wie ich es auf meinen aktuellen Tisch anwenden kann. Die beiden Spaltennamen lauten „Individualid“ und „Email_HASHED“. Ich habe das unten bearbeitete Skript in meine Tabelle eingefügt, es zeigte jedoch einen Fehler an. Könnten Sie für mich debuggen? Danke schön!
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);
Betreff: Erstellen Sie eine neue ID, um mit Mehrfach-zu-Mehrfach-Beziehungen umzugehenDanke, Dale! Ja, das ist ein berechtigter Punkt, aber für diesen Geschäftsfall haben wir beschlossen, Personen mit derselben E-Mail-Adresse wie eine Person zu behandeln, um die Reihenfolge ihres anderen Verhaltens zu berechnen.Betreff: Erstellen Sie eine neue ID, um mit Mehrfach-zu-Mehrfach-Beziehungen umzugehenDas scheint definitiv eine etwas seltsame Art und Weise zu sein @dale_lehman genannt. Sie könnten dies zumindest mit Rekursion skripten. Unten ist ein sehr chaotischer Beispielcode, der zumindest mit meinen Beispieldaten zu funktionieren schien (wenn ich die Idee richtig verstanden habe):
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);Ich habe in der Funktion zusätzliche Optionen „Wo auswählen“ und „Wartezeiten“ hinzugefügt, um zu zeigen, was gerade passiert.
Betreff: Erstellen Sie eine neue ID, um mit Mehrfach-zu-Mehrfach-Beziehungen umzugehenIch denke, Sie brauchen jemanden, der das Drehbuch schreibt.Ich habe eine Reihe von Möglichkeiten ausprobiert, aber es scheint nichts zu geben, was funktioniert – und es waren so viele Schritte erforderlich, dass es sich anscheinend nicht lohnt.Allerdings finde ich die Situation etwas seltsam – es gibt Leute mit mehreren E-Mail-Adressen, wie es üblich ist, aber es gibt auch mehrere Leute, die dieselbe E-Mail-Adresse verwenden, was auch passiert.Sie möchten jedoch einzigartige Personen identifizieren. Ich verstehe nicht, warum Sie sagen würden, dass zwei Personen mit derselben E-Mail-Adresse tatsächlich nur eine Person sind?In Ihrem Beispiel möchten Sie offenbar die Personen-ID Nr. 2 als eindeutige Person ausschließen, da diese E-Mail-Adressen mit anderen teilt.Aber warum sollte das bedeuten, dass sie keine einzigartige Person sind?Ist es möglich, dass Sie dieses Problem mehr als nötig verkomplizieren?Ich würde mich eher auf eindeutige IDs konzentrieren und dann eine Liste der damit verbundenen E-Mail-Adressen benötigen, eine einfache Tabellarisierungsfunktion.
Betreff: Erstellen Sie eine neue ID, um mit Mehrfach-zu-Mehrfach-Beziehungen umzugehenHallo Dale! Ich habe die Informationen im ursprünglichen Beitrag aktualisiert. Bitte überprüfen Sie es, danke!Betreff: Erstellen Sie eine neue ID, um mit Mehrfach-zu-Mehrfach-Beziehungen umzugehenHallo Paul! Ich habe die Informationen im ursprünglichen Beitrag aktualisiert. Bitte überprüfen Sie es, danke!Betreff: Erstellen Sie eine neue ID, um mit Mehrfach-zu-Mehrfach-Beziehungen umzugehenIch denke, Sie können das erreichen, indem Sie tabellarisch aufbereiten (wie in meinem Beispiel), dann eine Datentabelle erstellen und dann eine verkettete Spalte erstellen (mehrere Verketten, wenn Sie „,“ einfügen möchten).
Betreff: Erstellen Sie eine neue ID, um mit Mehrfach-zu-Mehrfach-Beziehungen umzugehenIch denke, was benötigt wird, ist eine Tabelle wie:
aus einer Tabelle, die so aussieht:
| AUSWEIS | Email |
| 10 | ... |
| 11 | ... |
| 12 | .. |
| 15 | .. |
| 16 | .. |
| 17 | .. |
| 18 | .. |
Mir ist jedoch unklar, woher Sie wissen sollen, welche IDs und welche E-Mails zu derselben Person gehören. Darum ging es also in meiner Frage.
Betreff: Erstellen Sie eine neue ID, um mit Mehrfach-zu-Mehrfach-Beziehungen umzugehenIch glaube nicht, dass ich verstehe, was du willst.Es hört sich so an, als könnten Sie die beiden Spalten einfach verketten und hätten für jede Beobachtung eine eindeutige Personen-/E-Mail-Kombination.Wenn Sie jede Person oder jede E-Mail in einer eigenen Zeile haben möchten, verwenden Sie einfach Tabulate.Ich habe eine Beispieltabelle angehängt, die die Multiple-Multiple-Zuordnung zeigt, mit einer Tabellierung sowie einer neuen Spalte mit einer eindeutigen Kennung.Vielleicht können Sie uns anhand dieses Beispiels mitteilen, was Sie wollen.
Betreff: Erstellen Sie eine neue ID, um mit Mehrfach-zu-Mehrfach-Beziehungen umzugehenWoher bekommen Sie also die Informationen, die Ihnen sagen, welche eindeutige Nummer eine einzigartige Person ist? Basierend auf nur diesen beiden Spalten, die Sie beschreiben, haben Sie keine andere Wahl, als eine der Spalten zum eindeutigen Bezeichner zu machen und die andere ihr zuzuordnen. Vielleicht ein paar Beispieldaten posten?