Rimozione di righe duplicate dalla tabella correnteCiao,
Ho 256k righe in una tabella padre in questo momento. Durante l'analisi, ho scoperto di avere poche righe duplicate. Questa tabella riceve costantemente nuovi dati modificati tramite script. E c'è la possibilità che i dati di origine possano essere duplicati di nuovo.
Quindi sto cercando di creare uno script di pulizia, che posso eseguire prima di eseguire alcune delle mie analisi. Ho cercato altre discussioni qui e ho trovato una soluzione ( https://community.jmp.com/t5/Discussions/Eliminating-Duplicate-Rows-keeping-first-duplicate/td-p/3424 ), che ho personalizzato per la mia applicazione
dt3 = Current Data Table();
dt2 = dt3 << Summary(
group(:CL1, :CL2, :CL3, :CL4)
);
dt3 << join(
with (dt2),
update,
by matching columns (
:CL1 = :CL1,
:CL2 = :CL2,
:CL3 = :CL3,
:CL4 = :CL5
),
drop multiples(1,0),
name("include non-matches")(0,0),
preserve main table order (1),
);
Questa soluzione ha fatto quello che stavo cercando. Tuttavia, non è in grado di aggiornare la tabella padre. Crea una nuova tabella con le righe giuste, ma la mia tabella padre è invariata. Come posso utilizzare questo codice sulla mia tabella padre per eliminare le righe dalla tabella padre, che in questo caso è "Currnet Data Table()".
Inoltre, (lo so già, ma volevo confermare), ho 25 colonne nel mio set di dati. Devo eseguire sopra lo script per abbinare tutte le 25 colonne per essere accurato o finché ho una colonna del tempo, posso eseguire un numero inferiore di colonne (come 4 nell'esempio sopra)? Non volevo rallentare lo script poiché avrò un'enorme quantità di dati nel file JMP.
Grazie in anticipo!
Re: Rimozione di righe duplicate dalla tabella correnteGrazie GZMORGAN0,
Sono stato in grado di utilizzare la tua metodologia per eliminare eventuali duplicati. Creata nuova colonna con formula DIF. Quindi, utilizzando la colonna del tempo ordinata per script, seleziona gli zeri (diff = 0 che significa riga duplicata) ed elimina i duplicati.Re: Rimozione di righe duplicate dalla tabella correnteNiiD,
Se il tempo è il tuo identificatore principale, un'opzione è creare una nuova colonna per Dif(:Dataora,1) o ottieni le righe in cui Dif(:Datetime,1) ==0 dovrebbe essere un duplicato. Se, tuttavia, possono esserci record con la stessa data e ora, ma strumenti o altri identificatori diversi, ordina in base a tali identificatori e Data ora e quindi ottieni le righe dove o seleziona dove identificatore == Lag(identifier,1) & Dif(:Datetime,1 ) ==0. Quindi elimina quelle righe.
Re: Rimozione di righe duplicate dalla tabella correnteGrazie! proverò a usare il tuo codice per vedere se posso adattarlo.
Ho una colonna del tempo, che posso usare l'ordinamento per ottenere righe identiche una accanto all'altra. Tutte le altre colonne sono dati di processo effettivi, quindi non ci sono duplicati (diversi dagli identificatori di processo come il nome del prodotto, il tipo di prodotto). Ma la colonna del tempo può essere utilizzata per ordinare e avere righe identiche una accanto all'altra. quindi la domanda diventa è selezionare una delle righe identiche.
Ho scoperto che JMP 14 ha una nuova funzionalità, ma non è supportata in JMP 13 (la mia versione). Quindi forse se c'è un piccolo codice facile per selezionare la riga duplicata (una delle due voci), allora posso semplicemente eliminarli.
dt3 = Data Table( "ProcessDataTable" ) << Select Duplicate Rows();
Sfondo sui duplicati: il mio script estrae i dati da un file CSV che viene generato settimanalmente, che viene importato nella tabella master JMP. I dati settimanali sono trascorsi sette giorni dal momento in cui sono stati generati. Quindi, se per una settimana il CSV è stato generato lunedì alle 12:00 e la settimana successiva è stato generato lunedì alle 8:00, potrebbero esserci un duplicato di tre ore.
Questo è ciò che sto cercando di escludere una volta che i dati entrano in JMP. Non è possibile eliminare i duplicati prima che raggiungano JMP, quindi spero in una soluzione in JMP.
Re: Rimozione di righe duplicate dalla tabella correnteNiiD,
Mancano informazioni chiave sui tuoi dati: ci sono una o più colonne che dovrebbero rappresentare un record univoco. Per esempio:
- una linea di produzione a più fasi, come i semiconduttori, in genere utilizza le colonne Lot#, Wafer#, Operation#, Equip ID e Datetime
- uno studio farmacologico a misure ripetute: ID soggetto e Datetime
- eccetera.
Quindi, se queste colonne devono rappresentare record (chiavi) univoci, le altre colonne non dovrebbero avere importanza e devi decidere se desideri conservare il primo o l'ultimo record.In altre parole, l'ordine del tuo tavolo fornisce informazioni sui duplicati? Ad esempio, i database sono spesso ordinati dal più recente al più vecchio.
Lo script allegato crea una tabella di 256.000 righe univoche e 25 colonne. Seleziona casualmente 200 righe. I primi 100 vengono duplicati una volta che i secondi 100 vengono duplicati due volte e l'ordine della tabella viene mescolato. Quindi ora ci sono 256.300 righe.
È stato creato con 2 colonne di stringhe e 2 colonne di interi, quindi 4 colonne che rappresentano le chiavi univoche.E questo script mantiene la riga con l'ordine più alto nella tabella. Le tabelle intermedie sono impostate come invisibili per testare le prestazioni senza tempo di rendering. Tuttavia, per capire cosa sta facendo il codice, potresti voler convertirli in modo che siano visibili.
L'ho eseguito 6 volte e ciascuna ha impiegato 2,0x secondi sul mio PC.Il tempo varierà a seconda del numero di duplicati.
Lo script trova le righe da eliminare lavorando solo sulle righe duplicate che dovrebbero essere molto più piccole di 256k.
Nota finale. Invece di eliminare quelle righe dalla tabella principale, potresti voler escluderle o mantenere una colonna di Mantieni o Salva in modo da poter reimpostare gli stati di riga per escluderli.
Buona fortuna!