Erstellen Sie eine neue ID, um mit mehreren zu mehreren Beziehungen umzugehenHallo, ich habe Daten mit 2 Spalten, eine ist eine individuelle ID und eine ist eine E-Mail. Das Problem mit diesen Daten besteht darin, dass die Beziehung zwischen individueller ID und E-Mail mehrere zu mehrere 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 mit einer neuen eindeutigen ID für alle individuellen IDs / E-Mails erstellen, die angibt, dass diese einzelnen IDs oder E-Mails, wenn sich Überlappungen ergeben, tatsächlich dieselbe Person sind. Ich konnte mir nicht wirklich vorstellen, wie ich es ohne Skript machen könnte. Könnte jemand helfen? Danke!
AnalytikBetreff: Erstellen Sie eine neue ID, um mit mehreren zu mehreren Beziehungen umzugehenWoher erhalten Sie die Informationen, aus denen hervorgeht, welche eindeutige Nummer eine eindeutige Person ist? Basierend auf nur diesen beiden Spalten, die Sie beschreiben, haben Sie keine andere Wahl, als eine der Spalten zur eindeutigen Kennung zu machen und die andere darauf abzubilden. Vielleicht einige Beispieldaten posten?
Betreff: Erstellen Sie eine neue ID, um mit mehreren zu mehreren 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 für jede Beobachtung eine eindeutige Kombination aus Person und E-Mail haben.Wenn Sie möchten, dass jede Person oder jede E-Mail in einer eigenen Zeile steht, verwenden Sie einfach Tabulat.Ich habe eine Beispieltabelle angehängt, die die Mehrfach-Mehrfach-Zuordnung mit einer Tabelle sowie einer neuen Spalte mit einer eindeutigen Kennung zeigt.Vielleicht können Sie dieses Beispiel verwenden, um uns zu sagen, was Sie wollen.
Betreff: Erstellen Sie eine neue ID, um mit mehreren zu mehreren Beziehungen umzugehenIch denke, was benötigt wird, ist ein Tisch wie:
von einem Tisch, der so aussieht:
| ICH WÜRDE | Email |
| 10 | ... |
| 11 | ... |
| 12 | .. |
| 15 | .. |
| 16 | .. |
| 17 | .. |
| 18 | .. |
Mir ist jedoch unklar, woher Sie wissen, welche IDs und welche E-Mails derselben Person gehören. Darum ging es bei meiner Frage.
Betreff: Erstellen Sie eine neue ID, um mit mehreren zu mehreren Beziehungen umzugehenIch denke, Sie können dies tun, indem Sie (wie in meinem Beispiel) tabellieren, dann eine Datentabelle erstellen und dann eine Spaltenverkettung erstellen (mehrere Verkettungen, wenn Sie das "," einfügen möchten).
Betreff: Erstellen Sie eine neue ID, um mit mehreren zu mehreren 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 mehreren zu mehreren 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 mehreren zu mehreren Beziehungen umzugehenIch denke, Sie brauchen jemanden, der das Skript erstellt.Ich habe verschiedene Möglichkeiten ausprobiert, kann aber anscheinend nichts finden, was funktioniert - und es waren so viele Schritte erforderlich, dass es sich nicht lohnt.Ich finde die Situation jedoch etwas seltsam - Sie haben Leute mit mehreren E-Mail-Adressen, wie es üblich ist, aber Sie haben auch mehrere Leute, die dieselbe E-Mail-Adresse verwenden, was auch passiert.Sie möchten jedoch eindeutige Personen identifizieren. Ich verstehe nicht, warum Sie sagen würden, dass zwei Personen, die dieselbe E-Mail-Adresse verwenden, wirklich nur eine Person sind.In Ihrem Beispiel möchten Sie anscheinend 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 komplizieren?Meine Neigung wäre, mich nur auf eindeutige IDs zu konzentrieren und dann die Liste der mit ihnen verknüpften E-Mail-Adressen zu erhalten, eine einfache Tabellenfunktion.
Betreff: Erstellen Sie eine neue ID, um mit mehreren zu mehreren Beziehungen umzugehenDies scheint definitiv ein bisschen komisch zu sein @dale_lehman sagte. Sie können dies zumindest mit Rekursion skripten. Unten ist ein sehr unordentlicher 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 zusätzliche Select Where and Waits in der Funktion hinzugefügt, um zu zeigen, was los ist.
Betreff: Erstellen Sie eine neue ID, um mit mehreren zu mehreren Beziehungen umzugehenVielen Dank, Dale! Ja, es ist ein gültiger 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 mehreren zu mehreren Beziehungen umzugehenVielen Dank Jarmo! Dieses Ergebnis aus Ihrem Skript ist genau das, was ich brauche. Ich bin mit dem Skript nicht vertraut, daher nur eine folgende Frage, wie ich es auf meine aktuelle Tabelle anwenden kann. Die beiden Spaltennamen sind "Individualid" und "Email_HASHED". Ich habe das unten bearbeitete Skript in meine Tabelle eingefügt, aber es wurde ein Fehler angezeigt. Könntest du für mich debuggen? Danke!
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 mehreren zu mehreren Beziehungen umzugehenIch habe das Skript ein wenig geändert (die Rekursion wurde in die while-Schleife geändert, da die Rekursion von Zeit zu Zeit etwas schwierig zu verstehen sein kann). Auch die Spaltennamen wurden 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-Referenzen aus Ihrer geänderten Version entfernt haben, was zu Problemen führen kann.
Betreff: Erstellen Sie eine neue ID, um mit mehreren zu mehreren Beziehungen umzugehenDanke Jarmo! Wie ändere ich das dt in meine aktuelle Datentabelle, erstelle aber keine neue Tabelle mit den von Ihnen eingegebenen Beispielen?Betreff: Erstellen Sie eine neue ID, um mit mehreren zu mehreren Beziehungen umzugehendt = current data table();
oder
dt = Data table("Name of table here")