crear una nueva identificación para tratar con una relación múltiple a múltiple*Actualizar
Lo siento, debería ser más claro en la pregunta. Los datos que tengo actualmente se ven así:
correo electrónico de identificación
1 un
1 segundo
2 un
2c
3 días
Podemos ver que id 1 2 y email abc son en realidad la misma persona porque la información se superpone.
Lo que estoy tratando de hacer aquí es crear una tabla de coincidencias con una nueva clave que pueda usar para volver a coincidir con la tabla original para identificar que las que se superponen son en realidad la misma persona:
nuevo ID id/correo electrónico
111 1
111 2
111 un
111b
111c
222 días
La nueva identificación no necesita tener una forma específica, incluso puede ser igual a la identificación original, siempre que podamos usarla para identificar a una "persona única".
-------------------------------------
Hola, 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 múltiple, lo que significa que una identificación individual podría tener múltiples correos electrónicos y un correo electrónico podría tener varias identificaciones individuales. Por lo tanto, necesitaría crear una tabla de mapeo de una nueva identificación única para todas las identificaciones/correos electrónicos individuales, que especifica que esas identificaciones o correos electrónicos individuales, si se superponen, son en realidad la misma persona. Realmente no podía pensar en una manera de hacerlo sin guión. ¿Alguien podría ayudar? ¡Gracias!
Fusión y limpieza de datosIngeniería de Calidad y ProcesosRe: crear una nueva identificación para tratar con una relación múltiple a múltiple¡Muchas gracias Jarmo! ¡¡Funciona!!Re: crear una nueva identificación para tratar con una relación múltiple a múltipleLeí/entendí incorrectamente cómo quería manejar los valores faltantes. Quieres un valor único para cada uno de ellos, ¿verdad? Debido a que los valores faltantes se manejan en último lugar, puede simplemente reemplazar las últimas filas después de //manejar lo que falta con el siguiente script:
//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">Re: crear una nueva identificación para tratar con una relación múltiple a múltiple</LINGO-SUB><LINGO-BODY id="lingo-body-366610" slang="en-US" mode="NONE"><P>Hola Jarmo, el resultado parece ser el mismo que el anterior, como captura de pantalla adjunta. El "newid1" es el que usa el script anterior, y el "newid" es el que usa su último script, que al igual que el anterior, asignó a esas diferentes identificaciones individuales con correo electrónico vacío el mismo newid "750". ¿Podrías comprobarlo? ¡Gracias!</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">Re: crear una nueva identificación para tratar con una relación múltiple a múltiple</LINGO-SUB><LINGO-BODY id="lingo-body-366510" slang="en-US" mode="NONE"><P>No se pudieron replicar los resultados (lo más probable es que tenga diferentes identificaciones individuales en la que comienza con 308....)</P><P> </P><P>¿El resultado de esto parece correcto?</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
Re: crear una nueva identificación para tratar con una relación múltiple a múltipleHola Jarmo, abajo tienes un ejemplo. puede ver que muchas filas que tienen correo electrónico vacío están todas agrupadas como newid 5. Si el ID individual no se superpone con otros grupos, aquellos que no tengan correos electrónicos deben tener cada uno su propio ID nuevo. ¡Gracias!

Re: crear una nueva identificación para tratar con una relación múltiple a múltiple¿Cómo deben manejarse? Lo más probable es que sean una o dos declaraciones if.
Un pequeño conjunto de datos de ejemplo con respuestas correctas podría ayudar.
Re: crear una nueva identificación para tratar con una relación múltiple a múltipleHola, Jarmo, olvidé mencionar que en la columna de correo electrónico hay algunas filas que tienen celdas vacías, lo que significa que alguna identificación individual no tiene nada en la columna de correo electrónico. Descubrí que el script actual considerará todas las identificaciones individuales que no tengan correos electrónicos como la misma identificación nueva. ¿podría ayudar a ajustar el guión para evitar este tipo de situación? ¡Gracias!Re: crear una nueva identificación para tratar con una relación múltiple a múltiple¡Muchas gracias Jarmo! ¡¡Funciona!! Realmente aprecio tu ayuda.Re: crear una nueva identificación para tratar con una relación múltiple a múltipleY dependiendo de cómo obtenga la tabla de datos, puede hacer referencia a ella directamente:
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; ");etcétera
Re: crear una nueva identificación para tratar con una relación múltiple a múltipledt = current data table();
o
dt = Data table("Name of table here")Re: crear una nueva identificación para tratar con una relación múltiple a múltipleGracias Jarmo! ¿Cómo cambio el dt a mi tabla de datos actual pero no creo la nueva tabla con las muestras que ingresó?Re: crear una nueva identificación para tratar con una relación múltiple a múltipleModifiqué un poco el script (cambié la recursividad a while loop ya que la recursividad puede ser un poco difícil de entender de vez en cuando). También cambió 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 que eliminó las referencias dt de su versión modificada, lo que podría causar problemas.
Re: crear una nueva identificación para tratar con una relación múltiple a múltiple¡Muchas gracias Jarmo! Este resultado de su guión es exactamente lo que necesito. No estoy familiarizado con el script, así que solo una pregunta sobre cómo aplicarlo en mi tabla actual. los dos nombres de columna son "Individualid" y "Email_HASHED", pegué el script editado a continuación en mi tabla pero mostró un error. ¿podrías depurar por mí? ¡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 tratar con una relación múltiple a múltiple¡Gracias Dale! Sí, es un punto válido, pero para este caso de negocios decidimos tratar a las personas con el mismo correo electrónico como una sola persona para calcular la secuencia de su otro comportamiento.Re: crear una nueva identificación para tratar con una relación múltiple a múltipleEsto definitivamente parece una forma un poco rara de hacerlo como @dale_lehman dicho. Podría escribir esto al menos con recursividad. A continuación se muestra un código de ejemplo muy complicado 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 Esperas adicionales dentro de la función para tratar de mostrar lo que está pasando.
Re: crear una nueva identificación para tratar con una relación múltiple a múltipleCreo que necesitas a alguien que escriba esto.Lo he intentado de varias maneras, pero parece que no puedo obtener nada que funcione, y hubo tantos pasos involucrados que no parece valer 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 realmente una sola persona.En su ejemplo, parece que desea excluir la identificación de la persona n. ° 2 como una persona única porque comparte direcciones de correo electrónico con otros.Pero, ¿por qué eso significaría que no son una persona única?¿Es posible que estés complicando este problema más de lo necesario?Mi inclinación sería centrarme simplemente en los identificadores únicos y luego desear la lista de direcciones de correo electrónico asociadas con ellos, una simple función de tabulación.
Re: crear una nueva identificación para tratar 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 tratar 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 tratar 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 concatenación de columnas (concatenaciones múltiples si desea insertar ",").
Re: crear una nueva identificación para tratar 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 | correo electrónico |
| 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 tratar con una relación múltiple a múltipleNo creo entender lo que quieres.Parece que podría simplemente 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 de múltiples múltiples, con una tabulación y una nueva columna con un identificador único.Tal vez pueda usar este ejemplo para decirnos lo que quiere.
Re: crear una nueva identificación para tratar 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? Basado 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 asignarle la otra. ¿Quizás publicar algunos datos de ejemplo?