Manipuler un grand ensemble de données (script)Bonjour,
Je veux manipuler un grand ensemble de données GC-MS (48 millions de lignes) et je suis bloqué à une étape intermédiaire de la manipulation des données.
Je souhaite créer une nouvelle table, par script, à partir d'une table intermédiaire Num-Example.jmp ici joint (c'est un sous-ensemble de 14 lignes de ma table intermédiaire de 340 000 lignes = conditions qui doivent conduire à la table finale de 48 millions lignes = condition & données) .
Pour ce sous-ensemble, je dois créer automatiquement (par le biais de scripts) une nouvelle table contenant 2119 lignes (cela correspond à la ligne 14 de la colonne Cumulative[A] dans Num-Example.jmp) avec une colonne ":ID#" remplie avec ID# = "1" dans les 131 premières lignes, puis ID# = "2" dans les 150 lignes suivantes, et ainsi de suite.
ID# = "1" et 131 proviennent des informations de la ligne 1 de Num-Example.jmp (colonne "ID#" pour l'ID# et colonne ":A" pour le nombre de lignes à créer dans la nouvelle table).
ID# = "2" et 150 proviennent des informations de la ligne 2 de Num-Example.jmp.
et ainsi de suite jusqu'à la dernière ligne = 14 (ID# = 14).
Merci de votre aide.
Emmanuel
Re : Manipuler un grand ensemble de données (script)Étant donné la taille des ensembles de données, j'éviterais de mettre quoi que ce soit dans une table de données jusqu'à la toute fin. Travaillez autant que possible avec des matrices. Quelque chose comme ça pourrait fonctionner :
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 : Manipuler un grand ensemble de données (script)Cela semble bien fonctionner uniquement en utilisant une table de données
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 : Manipuler un grand ensemble de données (script)Je serais prudent avec cette approche. À moins que la table d'entrée ne soit petite, cela va être très lent.J'ai jeté un coup d'œil rapide aux deux approches avec des tables d'entrée de 1 000 et 10 000 lignes. La différence de vitesse était respectivement de ~4X et ~12X (0,6958 s contre 0,1722 s pour 1 000 et 6,64 s contre 0,543 s pour 10 000)
Ce qui serait intéressant serait de préallouer les lignes du tableau puis d'écrire directement dans le tableau. Y aurait-il alors une grande différence ?
Re : Manipuler un grand ensemble de données (script)Bonjour, merci à vous deux Don et Sam. Les 2 solutions fonctionnent mais comme l'a dit Don, l'utilisation de matrices est plus rapide avec mon grand ensemble de données. Emmanuel