Carissimi,
Ho una tabella dati che contiene ID, dati dell'ultima ispezione e colonne della decisione dell'ultima ispezione. Desidero combinare l'ultima colonna dei dati di ispezione con l'ultima decisione di ispezione per avere una colonna (impilata) da utilizzare nell'analisi di associazione. Ad esempio, un cluster della mia struttura dati è simile al seguente:
ID Decisione dell'ultima ispezione Dati dell'ultima ispezione
101 SPECIFICHE PRODOTTO DIFETTOSO
101 Deviazioni CGMP
101 21 CFR 211.113
101 VAI LIQ_US
Vorrei spostare la decisione dell'ultima ispezione, in questo caso VAI, nella colonna Dati dell'ultima ispezione e creare una nuova riga con lo stesso ID, in questo caso 101. Pertanto ho bisogno che i miei dati in pila siano come:
ID dati ultima ispezione
101 SPECIFICHE PRODOTTO DIFETTOSO
101 Deviazioni CGMP
101 21 CFR 211.113
101 LIQ_US
101 VAI
Inoltre, alcuni di questi ID sono ripetuti ma con valore diverso in uno o più Dati Ultima Ispezione. Ad esempio, Lab DEFECT può essere un altro problema per lo stesso ID, quindi creo un altro cluster di righe ogni volta che uno qualsiasi di questi valori differisce da quello precedente.
ID Decisione dell'ultima ispezione Dati dell'ultima ispezione
101 Lab DIFETTO
101 Deviazioni CGMP
101 21 CFR 211.113
101 VAI LIQ_US
Grazie mille per il vostro aiuto in anticipo.
Migliore,
Qais
Non sono sicuro di aver capito bene, ma ecco un'alternativa. Se è quello che vuoi, devi anche vedere quanto bene si ridimensionerà.
NamesDefaultToHere(1);
// Example table . . .
dt = New Table( "Inspection",
Add Rows( 10 ),
New Column( "ID",
Character,
"Nominal",
Set Values(
{"101", "101", "101", "101", "102", "102", "102", "101", "101", "101"}
)
),
New Column( "Last Inspection Decision",
Character,
"Nominal",
Set Values( {"", "", "", "VAI", "", "", "Code 1", "", "", "Code 2"} )
),
New Column( "Last Inspection Data",
Character,
"Nominal",
Set Values(
{"PRODUCT SPECIFICATIONS DEFECT", "CGMP Deviations", "21 CFR 211.113",
"LIQ_US", "PRODUCT SPECIFICATIONS DEFECT", "21 CFR 211.113", "LIQ_US",
"PRODUCT SPECIFICATIONS DEFECT", "CGMP Deviations", "21 CFR 211.113"}
)
)
);
// Copy the table
dt2 = Eval(dt << getScript);
dt2 << setName(dt << getName ||" Stacked");
// Get the values from the two columns of interest into lists
ids = Column(dt2, "ID") << getValues;
vals = Column(dt2, "Last Inspection Data") << getValues;
// Find out where we need to insert new values, get the required values, and insert them into the right positions
insertAfter = dt2 << getRowsWhere(!IsMissing(:Last Inspection Decision));
for(r=1, r<= NItems(insertAfter), r++,
InsertInto(ids, Column(dt2, "ID")[insertAfter[r]], insertAfter[r] + r);
InsertInto(vals, Column(dt2, "Last Inspection Decision")[insertAfter[r]], insertAfter[r] + r);
);
// Add rows to teh copy of the table, insert the column values, and delete the column we don't need
dt2 << addRows(NRows(insertAfter));
Column(dt2, "ID") << setValues(ids);
Column(dt2, "Last Inspection Data") << setValues(vals);
dt2 << deleteColumns(:Last Inspection Decision);
CIAO,
Non funziona perché ho più di 100.000 righe. Ho provato a suddividere i miei dati in tre parti, ciascuna con quasi 35.000 righe, ma non funziona. Qualche suggerimento?
Migliore,
Qais
Questa non è la soluzione più robusta, ma provaci:
dt = current data table ();
for each row( if(!is missing (:Last Inspection Decision),
dt << add rows(1, row()),
is missing (:Last Inspection Data), :Last Inspection Data[row()] = :Last Inspection Decision[row()-1])
);