Manipular grandes conjuntos de datos (secuencias de comandos)Hola,
Quiero manipular un gran conjunto de datos de GC-MS (48 millones de filas) y me quedo atascado en un paso intermedio de manipulación de datos.
Quiero crear una nueva tabla, a través de secuencias de comandos, a partir de una tabla intermedia Num-Example.jmp aquí adjunto (es un subconjunto de 14 filas de mi tabla intermedia de 340 000 filas = condiciones que deberían conducir a la tabla final de 48 millones filas = condición y datos).
Para este subconjunto, necesito crear automáticamente (a través de secuencias de comandos) una nueva tabla que contenga 2119 filas (esto corresponde a la fila 14 de la columna Acumulativo [A] en Num-Example.jmp) con una columna ":ID#" rellenada con ID# = "1" en las primeras 131 filas, luego ID# = "2" en las siguientes 150 filas y así sucesivamente.
ID# = "1" y 131 provienen de la información en la fila 1 de Num-Example.jmp (columna "ID#" para el ID# y columna ":A" para el número de filas a crear en la nueva tabla).
ID# = "2" y 150 provienen de la información en la fila 2 de Num-Example.jmp.
y así sucesivamente hasta la última fila = 14 (ID# = 14).
Gracias por tu ayuda.
emmanuel
Re: Manipular grandes conjuntos de datos (secuencias de comandos)Dado el tamaño de los conjuntos de datos, evitaría poner nada en una tabla de datos hasta el final. Trabaja tanto como puedas con matrices. Algo como esto podría funcionar:
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: Manipular grandes conjuntos de datos (secuencias de comandos)Esto parece funcionar bien solo usando una tabla de datos
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: Manipular grandes conjuntos de datos (secuencias de comandos)Tendría cuidado con este enfoque. A menos que la tabla de entrada sea pequeña, será muy lenta.Eché un vistazo rápido a los dos enfoques con tablas de entrada de 1000 y 10 000 filas. La diferencia de velocidad fue ~4X y ~12X, respectivamente (0,6958 s frente a 0,1722 s para 1000 y 6,64 s frente a 0,543 s para 10 000)
Lo que sería interesante sería preasignar las filas de la tabla y luego escribir directamente en la tabla. Habría mucha diferencia entonces?
Re: Manipular grandes conjuntos de datos (secuencias de comandos)Hola, gracias tanto a Don como a Sam. Las 2 soluciones funcionan pero, como dijo Don, el uso de matrices es más rápido con mi gran conjunto de datos. emmanuel