crear una nueva identificación para lidiar con una relación múltiple a múltipleHola, tengo datos con 2 columnas, una es identificación individual y otra es correo electrónico. El problema con estos datos es que la relación entre la identificación individual y el correo electrónico es de varios a múltiples, lo que significa que una identificación individual podría tener varios correos electrónicos y un correo electrónico podría tener varios identificadores individuales. Por lo tanto, necesitaría crear una tabla de mapeo de un nuevo ID único para todos los ID / correos electrónicos individuales, que especifique que esos ID individuales o correos electrónicos, si se superponen, son en realidad la misma persona. Realmente no podía pensar en una forma de hacerlo sin un guión. ¿Alguien podría ayudar? ¡Gracias!
AnalíticaRe: crear una nueva identificación para lidiar con una relación múltiple a múltipleEntonces, ¿dónde obtendrías la información que te dice qué número único es una persona única? Basándose solo en estas dos columnas que está describiendo, no tiene otra opción que hacer que una de las columnas sea el identificador único y asignar la otra a ella. ¿Quizás publicar algunos datos de ejemplo?
Re: crear una nueva identificación para lidiar con una relación múltiple a múltipleNo creo que entiendo lo que quieres.Parece que podría concatenar las dos columnas y tendría una combinación única de persona / correo electrónico para cada observación.Si desea que cada persona o cada correo electrónico esté en su propia fila, simplemente use Tabular.Adjunté una tabla de muestra que muestra el mapeo múltiple-múltiple, con una tabulación y una nueva columna con un identificador único.Quizás pueda usar este ejemplo para decirnos lo que quiere.
Re: crear una nueva identificación para lidiar con una relación múltiple a múltipleCreo que lo que se necesita es una tabla como:
de una tabla que se ve así:
| IDENTIFICACIÓN | Email |
| 10 | ... |
| 11 | ... |
| 12 | .. |
| 15 | .. |
| dieciséis | .. |
| 17 | .. |
| 18 | .. |
Pero no me queda claro cómo sabría qué ID y qué correo electrónico pertenecen a la misma persona, así que de eso se trataba mi pregunta.
Re: crear una nueva identificación para lidiar con una relación múltiple a múltipleCreo que puede hacerlo tabulando (como en mi ejemplo), luego convirtiéndolo en una tabla de datos y luego creando una columna concatenada (múltiples concatenaciones si desea insertar el ",").
Re: crear una nueva identificación para lidiar con una relación múltiple a múltiple¡Hola Pablo! Actualicé la información en la publicación original. ¡Por favor compruébalo, gracias!Re: crear una nueva identificación para lidiar con una relación múltiple a múltiple¡Hola Dale! Actualicé la información en la publicación original. ¡Por favor compruébalo, gracias!Re: crear una nueva identificación para lidiar con una relación múltiple a múltipleCreo que necesitas a alguien para escribir esto.He intentado varias formas, pero parece que no puedo obtener nada que funcione, y hubo tantos pasos involucrados que no parece que valga la pena.Sin embargo, encuentro la situación un poco extraña: tienes personas con varias direcciones de correo electrónico, como es común, pero también tienes varias personas que usan la misma dirección de correo electrónico, lo que también sucede.Sin embargo, desea identificar personas únicas; no veo por qué diría que dos personas que comparten la misma dirección de correo electrónico son en realidad solo una persona.En su ejemplo, parece querer excluir la identificación de la persona n. ° 2 como una persona única porque comparten direcciones de correo electrónico con otras personas.Pero, ¿por qué significa eso que no son una persona única?¿Es posible que esté complicando este problema más de lo necesario?Mi inclinación sería simplemente centrarme en identificadores únicos y luego querer la lista de direcciones de correo electrónico que están asociadas con ellos, una función de tabulación simple.
Re: crear una nueva identificación para lidiar con una relación múltiple a múltipleEsto definitivamente parece una forma un poco extraña de hacerlo como @dale_lehman dicho. Puede escribir esto al menos con recursividad. A continuación se muestra un código de ejemplo muy desordenado que parecía funcionar al menos con mis datos de ejemplo (si entendí la idea correctamente):
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);Agregué Seleccionar dónde y espera adicional dentro de la función para tratar de mostrar lo que está sucediendo.
Re: crear una nueva identificación para lidiar con una relación múltiple a múltiple¡Gracias Dale! Sí, es un punto válido, pero para este caso de negocio, decidimos tratar a las personas con el mismo correo electrónico que a una persona para calcular la secuencia de su otro comportamiento.Re: crear una nueva identificación para lidiar con una relación múltiple a múltiple¡Muchas gracias Jarmo! Este resultado de su secuencia de comandos es exactamente lo que necesito. No estoy familiarizado con el script, así que solo una pregunta siguiente sobre cómo aplicarlo en mi tabla actual. los dos nombres de columna son "Individualid" y "Email_HASHED", pegué el siguiente script editado en mi tabla pero mostró un error. ¿Podrías depurarme? ¡Gracias!
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: crear una nueva identificación para lidiar con una relación múltiple a múltipleModifiqué un poco el script (cambié la recursividad a un bucle while ya que la recursividad puede ser un poco difícil de entender de vez en cuando). También cambiaron los nombres de las columnas.
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];
);
);
);Ha visto haber eliminado las referencias dt de su versión modificada, lo que podría causar problemas.
Re: crear una nueva identificación para lidiar con una relación múltiple a múltiple¡Gracias Jarmo! ¿Cómo cambio el dt a mi tabla de datos actual pero no creo la nueva tabla con las muestras que ingresaste?Re: crear una nueva identificación para lidiar con una relación múltiple a múltipledt = current data table();
o
dt = Data table("Name of table here")