créer un nouvel identifiant pour gérer une relation multiple à multipleSalut, j'ai des données avec 2 colonnes, une est un identifiant individuel et une est un e-mail. Le problème avec ces données est que la relation entre l'identifiant individuel et l'e-mail est multiple à multiple, ce qui signifie qu'un identifiant individuel peut avoir plusieurs e-mails et qu'un e-mail peut avoir plusieurs identifiants individuels. Ainsi, je devrais créer une table de mappage d'un nouvel identifiant unique à tous les identifiants individuels / e-mails, qui spécifie que ces identifiants ou e-mails individuels en cas de chevauchement sont en fait la même personne. Je ne pouvais pas vraiment penser à un moyen de le faire sans script. Quelqu'un pourrait-il aider? Merci!
AnalytiqueRe: créer un nouvel identifiant pour gérer une relation multiple à multipleAlors, où obtiendriez-vous les informations qui vous indiquent quel numéro unique est une personne unique? En vous basant uniquement sur ces deux colonnes que vous décrivez, vous n'avez pas d'autre choix que de faire de l'une des colonnes l'identifiant unique et d'y associer l'autre. Peut-être publier des exemples de données?
Re: créer un nouvel identifiant pour gérer une relation multiple à multipleJe ne pense pas comprendre ce que tu veux.Il semble que vous pourriez simplement concaténer les deux colonnes et que vous auriez une combinaison unique de personne / e-mail pour chaque observation.Si vous voulez que chaque personne ou chaque e-mail ait sa propre ligne, utilisez simplement Tabulate.J'ai joint un exemple de tableau montrant le mappage multiple-multiple, avec une tabulation ainsi qu'une nouvelle colonne avec un identifiant unique.Peut-être pouvez-vous utiliser cet exemple pour nous dire ce que vous voulez.
Re: créer un nouvel identifiant pour gérer une relation multiple à multipleJe pense que ce qu'il faut, c'est une table comme:
à partir d'une table qui ressemble à ceci:
| identifiant | e-mail |
| dix | ... |
| 11 | ... |
| 12 | .. |
| 15 | .. |
| 16 | .. |
| 17 | .. |
| 18 | .. |
Mais je ne sais pas comment vous sauriez quelles pièces d'identité et quels courriels appartiennent à la même personne, c'est donc sur cela que portait ma question.
Re: créer un nouvel identifiant pour gérer une relation multiple à multipleJe pense que vous pouvez le faire en tabulant (comme dans mon exemple), puis en créant une table de données, puis en créant une colonne concaténante (plusieurs concaténations si vous voulez insérer le ",").
Re: créer un nouvel identifiant pour gérer une relation multiple à multipleSalut Paul! J'ai mis à jour les informations dans le message d'origine. Veuillez le vérifier, merci!Re: créer un nouvel identifiant pour gérer une relation multiple à multipleSalut Dale! J'ai mis à jour les informations dans le message d'origine. Veuillez le vérifier, merci!Re: créer un nouvel identifiant pour gérer une relation multiple à multipleJe pense que vous avez besoin de quelqu'un pour scénariser ceci.J'ai essayé un certain nombre de façons mais je n'arrive pas à obtenir quoi que ce soit qui fonctionne - et tellement d'étapes ont été impliquées que cela ne semble pas en valoir la peine.Cependant, je trouve la situation un peu étrange - vous avez des personnes avec plusieurs adresses e-mail, comme c'est courant, mais vous avez également plusieurs personnes utilisant la même adresse e-mail, ce qui se produit également.Cependant, vous souhaitez identifier des personnes uniques - je ne vois pas pourquoi vous diriez que deux personnes partageant la même adresse e-mail ne sont en réalité qu'une seule personne?Dans votre exemple, vous semblez vouloir exclure la personne n ° 2 en tant que personne unique, car elle partage des adresses e-mail avec d'autres.Mais pourquoi cela signifierait-il qu'ils ne sont pas une personne unique?Est-il possible que vous compliquiez ce problème plus que nécessaire?Mon inclination serait de me concentrer uniquement sur les identifiants uniques et de vouloir ensuite la liste des adresses e-mail qui leur sont associées, une simple fonction de tabulation.
Re: créer un nouvel identifiant pour gérer une relation multiple à multipleCela semble définitivement une façon un peu étrange de faire cela, car @dale_lehman mentionné. Vous pouvez au moins créer un script avec la récursivité. Vous trouverez ci-dessous un exemple de code très compliqué qui semblait fonctionner au moins avec mes données d'exemple (si j'ai bien compris l'idée):
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);J'ai ajouté des options supplémentaires Sélectionnez Où et Attend dans la fonction pour essayer de montrer ce qui se passe.
Re: créer un nouvel identifiant pour gérer une relation multiple à multipleMerci Dale! Oui, c'est un point valable, mais pour cette analyse de rentabilisation, nous avons décidé de traiter les personnes ayant le même e-mail comme une seule personne afin de calculer la séquence de leur autre comportement.Re: créer un nouvel identifiant pour gérer une relation multiple à multipleMerci beaucoup Jarmo! Ce résultat de votre script est exactement ce dont j'ai besoin. Je ne suis pas familier avec le script donc juste une question suivante sur la façon de l'appliquer sur ma table actuelle. les deux noms de colonne sont "Individualid" et "Email_HASHED", j'ai collé le script édité ci-dessous dans ma table mais il a montré une erreur. pourriez-vous déboguer pour moi? Merci!
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);
Re: créer un nouvel identifiant pour gérer une relation multiple à multipleJ'ai un peu modifié le script (j'ai changé la récursion en boucle while car la récursivité peut être un peu difficile de temps en temps à comprendre) Également changé les noms de colonne.
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];
);
);
);Vous avez vu avoir supprimé les références dt de votre version modifiée, ce qui pourrait causer des problèmes.
Re: créer un nouvel identifiant pour gérer une relation multiple à multipleMerci Jarmo! Comment puis-je changer le dt en ma table de données actuelle sans créer la nouvelle table avec les échantillons que vous avez mis?Re: créer un nouvel identifiant pour gérer une relation multiple à multipledt = current data table();
ou
dt = Data table("Name of table here")