creare un nuovo ID per gestire la relazione da più a più*Aggiornamento
Scusa, dovrei essere più chiaro sulla domanda. I dati che ho attualmente sono simili a:
e-mail di identificazione
1 un
1 b
2 un
2 c
3 d
Possiamo vedere che id 1 2 e email abc sono in realtà la stessa persona perché le informazioni si sovrappongono.
Quello che sto cercando di fare qui è creare una tabella delle corrispondenze con una nuova chiave che posso usare per far corrispondere la tabella originale per identificare quelle sovrapposte che sono in realtà la stessa persona:
newID id/e-mail
111 1
111 2
111 un
111 b
111 c
222 d
Il newID non ha bisogno di essere in una forma specifica, può anche essere uguale all'id originale, purché possiamo usarlo per identificare una "persona unica".
-------------------------------------
Salve, ho dati con 2 colonne, una è l'ID individuale e una è l'e-mail. Il problema con questi dati è che la relazione tra ID individuale ed e-mail è da multiplo a multiplo, il che significa che un singolo ID potrebbe avere più e-mail e un'e-mail potrebbe avere più ID individuali. Quindi avrei bisogno di creare una tabella di mappatura di un nuovo ID univoco per tutti gli ID individuali/e-mail, che specifichi che quegli ID individuali o e-mail in caso di sovrapposizione sono in realtà la stessa persona. Non riuscivo davvero a pensare a un modo per farlo senza sceneggiatura. Qualcuno potrebbe aiutare? Grazie!
Miscelazione e pulizia dei datiQualità e ingegneria di processoRi: creare un nuovo ID per gestire la relazione da più a piùGrazie mille Jarmo! Funziona!!Ri: creare un nuovo ID per gestire la relazione da più a piùHo letto/capito in modo errato come volevi gestire i valori mancanti. Vuoi un valore unico per ognuno di loro, giusto? Poiché i valori mancanti vengono gestiti per ultimi, puoi semplicemente sostituire le ultime righe dopo //handle missing con lo script seguente:
//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">Ri: creare un nuovo ID per gestire la relazione da più a più</LINGO-SUB><LINGO-BODY id="lingo-body-366610" slang="en-US" mode="NONE"><P>Ciao Jarmo, il risultato sembra essere lo stesso del precedente, come screenshot allegato. Il "newid1" è quello che utilizza lo script precedente e il "newid" è quello che utilizza il tuo ultimo script, che come il precedente ha assegnato a quei diversi ID individuali con e-mail vuota lo stesso newid "750". Potresti verificare, per favore? Grazie!</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">Ri: creare un nuovo ID per gestire la relazione da più a più</LINGO-SUB><LINGO-BODY id="lingo-body-366510" slang="en-US" mode="NONE"><P>Impossibile replicare i risultati (molto probabilmente hai diversi ID individuali su quello che inizia con 308....)</P><P> </P><P>Il risultato di questo sembra corretto?</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
Ri: creare un nuovo ID per gestire la relazione da più a piùCiao Jarmo, di seguito è riportato un esempio. puoi vedere molte righe con email vuote sono tutte raggruppate come newid 5. Se l'ID individuale non è sovrapposto ad altri gruppi, quelli senza email dovrebbero avere ciascuno il proprio nuovo ID. Grazie!

Ri: creare un nuovo ID per gestire la relazione da più a piùCome devono essere gestiti? Molto probabilmente si tratta di una o due istruzioni if.
Un piccolo set di dati di esempio con risposte corrette potrebbe aiutare.
Ri: creare un nuovo ID per gestire la relazione da più a piùCiao Jarmo, ho dimenticato di menzionare che nella colonna email ci sono alcune righe con celle vuote, il che significa che alcuni ID individuali non hanno nulla di popolato sotto la colonna email. Ho scoperto che lo script corrente considererà tutti i singoli ID che non hanno e-mail come lo stesso nuovo ID. potresti aiutare a modificare la sceneggiatura per evitare questo tipo di situazione? Grazie!Ri: creare un nuovo ID per gestire la relazione da più a piùGrazie mille Jarmo! Funziona!! Apprezzo davvero il tuo aiuto.Ri: creare un nuovo ID per gestire la relazione da più a piùE a seconda di come ottieni il datatable puoi fare riferimento direttamente a esso:
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; ");e così via
Ri: creare un nuovo ID per gestire la relazione da più a piùdt = current data table();
O
dt = Data table("Name of table here")Ri: creare un nuovo ID per gestire la relazione da più a piùGrazie Jarmo! Come cambio il dt nella mia tabella di dati corrente ma non creo la nuova tabella con i campioni che hai inserito?Ri: creare un nuovo ID per gestire la relazione da più a piùHo modificato un po 'lo script (cambiato la ricorsione in ciclo while poiché la ricorsione potrebbe essere un po' difficile di tanto in tanto da capire). Cambiati anche i nomi delle 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];
);
);
);Hai visto di aver rimosso i riferimenti dt dalla tua versione modificata, che potrebbe causare problemi.
Ri: creare un nuovo ID per gestire la relazione da più a piùGrazie mille Jarmo! Questo risultato della tua sceneggiatura è esattamente ciò di cui ho bisogno. Non ho familiarità con lo script, quindi solo una domanda seguente su come applicarlo sul mio tavolo attuale. i nomi delle due colonne sono "Individualid" e "Email_HASHED", ho incollato lo script modificato di seguito nella mia tabella ma ha mostrato un errore. potresti eseguire il debug per me? Grazie!
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);
Ri: creare un nuovo ID per gestire la relazione da più a piùGrazie Dal! Sì, è un punto valido, ma per questo business case abbiamo deciso di trattare le persone con la stessa email come una sola persona per calcolare la sequenza del loro altro comportamento.Ri: creare un nuovo ID per gestire la relazione da più a piùQuesto sembra decisamente un modo un po 'strano con questo come @dale_lehman disse. Potresti scriverlo almeno con la ricorsione. Di seguito è riportato un codice di esempio molto disordinato che sembrava funzionare almeno con i miei dati di esempio (se ho capito correttamente l'idea):
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);Ho aggiunto Select Where and Waits extra all'interno della funzione per provare a mostrare cosa sta succedendo.
Ri: creare un nuovo ID per gestire la relazione da più a piùPenso che tu abbia bisogno di qualcuno che scriva questo.Ho provato diversi modi ma non riesco a ottenere nulla che funzioni e sono stati coinvolti così tanti passaggi che non sembra valerne la pena.Tuttavia, trovo la situazione un po' strana: ci sono persone con più indirizzi e-mail, come è comune, ma ci sono anche più persone che usano lo stesso indirizzo e-mail, il che accade anche.Tuttavia, vuoi identificare persone uniche - non vedo perché diresti che due persone che condividono lo stesso indirizzo email sono davvero una sola persona?Nel tuo esempio, sembra che tu voglia escludere l'ID persona n. 2 come persona unica perché condivide gli indirizzi email con altri.Ma perché questo significherebbe che non sono una persona unica?È possibile che tu stia complicando questo problema più del dovuto?La mia inclinazione sarebbe quella di concentrarmi solo sugli ID univoci e quindi desiderare l'elenco degli indirizzi e-mail ad essi associati, una semplice funzione di tabulazione.
Ri: creare un nuovo ID per gestire la relazione da più a piùCiao Dal! Ho aggiornato le informazioni nel post originale. Si prega di controllare, grazie!Ri: creare un nuovo ID per gestire la relazione da più a piùCiao Paul! Ho aggiornato le informazioni nel post originale. Si prega di controllare, grazie!Ri: creare un nuovo ID per gestire la relazione da più a piùPenso che tu possa farlo tabulando (come nel mio esempio), quindi creando una tabella di dati e quindi creando una colonna concatenata (più concatenazioni se vuoi inserire ",").
Ri: creare un nuovo ID per gestire la relazione da più a piùPenso che quello che serve sia una tabella come:
da una tabella simile a questa:
| ID | e-mail |
| 10 | ... |
| 11 | ... |
| 12 | .. |
| 15 | .. |
| 16 | .. |
| 17 | .. |
| 18 | .. |
Ma non mi è chiaro come potresti sapere quali ID e quali e-mail appartengono alla stessa persona, quindi è di questo che si trattava la mia domanda.
Ri: creare un nuovo ID per gestire la relazione da più a piùNon credo di aver capito cosa vuoi.Sembra che potresti semplicemente concatenare le due colonne e avresti una combinazione persona/e-mail univoca per ogni osservazione.Se vuoi che ogni persona o ogni email nella propria riga, usa semplicemente Tabulate.Ho allegato una tabella di esempio che mostra la mappatura multipla multipla, con una tabulazione e una nuova colonna con un identificatore univoco.Forse puoi usare questo esempio per dirci cosa vuoi.
Ri: creare un nuovo ID per gestire la relazione da più a piùQuindi, dove otterresti le informazioni che ti dicono quale numero univoco è una persona unica? Basandoti solo su queste due colonne che stai descrivendo, non hai altra scelta che rendere una delle colonne l'identificatore univoco e mappare l'altra su di essa. Magari posta qualche dato di esempio?