Manipola set di dati di grandi dimensioni (script)Ciao,
Voglio manipolare un set di dati GC-MS di grandi dimensioni (48 milioni di righe) e rimango bloccato in una fase intermedia della manipolazione dei dati.
Voglio creare una nuova tabella, tramite script, da una tabella intermedia Num-Example.jmp qui allegata (è un sottoinsieme di 14 righe della mia tabella intermedia di 340 000 righe = condizioni che dovrebbero portare al tavolo finale di 48 milioni righe = condizione e dati) .
Per questo sottoinsieme devo creare automaticamente (tramite script) una nuova tabella contenente 2119 righe (corrisponde alla riga 14 della colonna Cumulative[A] in Num-Example.jmp) con una colonna ":ID#" popolata con ID# = "1" nelle prime 131 righe, quindi ID# = "2" nelle successive 150 righe e così via.
ID# = "1" e 131 provengono dalle informazioni nella riga 1 di Num-Example.jmp (colonna "ID#" per ID# e colonna ":A" per il numero di righe da creare nella nuova tabella).
ID# = "2" e 150 provengono dalle informazioni nella riga 2 di Num-Example.jmp.
e così via fino all'ultima riga = 14 (ID# = 14).
Grazie per l'aiuto.
Emanuele
Re: Manipola set di dati di grandi dimensioni (script)Data la dimensione dei set di dati, eviterei di inserire qualcosa in una tabella di dati fino alla fine. Lavora il più possibile con le matrici. Qualcosa del genere potrebbe funzionare:
Names Default to Here(1);
mainTbl = Current Data Table();
idCol = Column(mainTbl,"A");
idNumCol = Column(mainTbl,"ID#");
ids = idCol << Get Values;
idNums = idNumCol << Get Values;
firstVals = [1] |/ (Cumulative Sum(ids)+1)[1::(N Row(ids)-1)];
lastVals = Cumulative Sum(ids);
idMat = J(Sum(ids),1,0);
For Each({idVal,i},ids,
idMat[firstVals[i]::lastVals[i]] = Repeat(idNums[i],idVal)
);
Re: Manipola set di dati di grandi dimensioni (script)Questo sembra funzionare bene solo usando una tabella di dati
names default to here(1);
dt=current data table();
ca=column(dt,"A");
cid=column(dt,"id#");
rowranges=column(dt,"Cumulative [A]")<< get values;
rowranges=[0] |/ rowranges;
dtnew=new table();
cidnew=dtnew << new column("id#");
for(ii=1, ii<=n rows(dt), ii++,
dtnew << add rows(ca[ii], at end);
cidnew[rowranges[ii]::rowranges[ii+1] ]=cid[ii];
);Re: Manipola set di dati di grandi dimensioni (script)Starei attento con questo approccio. A meno che la tabella di input non sia piccola, sarà molto lenta.Ho dato una rapida occhiata ai due approcci con tabelle di input di 1000 e 10.000 righe. La differenza di velocità era rispettivamente di ~4X e ~12X (0,6958 sec contro 0,1722 sec per 1.000 e 6,64 sec contro 0,543 sec per 10.000)
Sarebbe interessante preallocare le righe della tabella, quindi scrivere direttamente nella tabella. Ci sarebbe molta differenza allora?
Re: Manipolazione di set di dati di grandi dimensioni (scripting)Ciao, grazie sia Don che Sam. Le 2 soluzioni funzionano ma, come ha detto Don, l'uso delle matrici è più veloce con il mio ampio set di dati. Emanuele