¿Cómo puedo multiplicar dos tablas juntas?Tengo una tabla de big data y una tabla de factores de normalización.
La tabla de datos se ve así:
| IDENTIFICACIÓN | Tipo | parámetro1 | parámetro2 | parámetro3 |
| 01 | 1 | datos | datos | datos |
| 02 | 1 | datos | datos | datos |
| 03 | 2 | datos | datos | datos |
| 04 | 2 | datos | datos | datos |
La tabla de factores de normalización se ve así:
| Tipo | parámetro1 | parámetro2 | parámetro3 |
| 1 | factor de normalización1 | factor de normalización 2 | factor de normalización3 |
| 2 | factor de normalización 4 | factor de normalización 5 | factor de normalización 6 |
¿Cómo puedo multiplicar la primera tabla por la segunda tabla según el tipo y el parámetro y obtener una nueva tabla como esta?
| IDENTIFICACIÓN | Tipo | parámetro1 | parámetro2 | parámetro3 |
| 01 | 1 | datos * factor de normalización1 | datos * factor de normalización2 | datos * factor de normalización3 |
| 02 | 1 | datos * factor de normalización1 | datos * factor de normalización2 | datos * factor de normalización3 |
| 03 | 2 | datos * factor de normalización 4 | datos * factor de normalización5 | datos * factor de normalización6 |
| 04 | 2 | datos * factor de normalización 4 | datos * factor de normalización5 | datos * factor de normalización6 |
Mi tabla de datos sin procesar es enorme tanto en filas como en columnas, así que quiero una solución rápida.
Muchas gracias.
Tabla de datosScriptingRe: ¿Cómo puedo multiplicar dos tablas juntas?Puede utilizar una combinación virtual y columnas de fórmula.
La unión virtual agrega las teclas azul y dorada
Puede vincularlos de forma interactiva o con JSL.
Esto puede estar usando nombres JMP16 con el : "parámetro3 [Tipo]" n sintaxis; es posible que necesite un nombre "parámetro3 [Tipo]" ) en lugar de.
// make example tables. **save them** so virtual join works.
factorDT = New Table( "Imported Data 2",
New Column( "Type", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2] ) ),
New Column( "parameter1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1.1, 1.2] ) ),
New Column( "parameter2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0.8, 0.9] ) ),
New Column( "parameter3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1.1, 0.9] ) )
);
factorDT << save( "$temp/factor.jmp" );
dataDT = New Table( "Imported Data",
New Column( "ID", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "Type", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 1, 2, 2] ) ),
New Column( "parameter1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "parameter2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 3, 2, 1] ) ),
New Column( "parameter3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [2, 3, 3, 2] ) )
);
dataDT << save( "$temp/data.jmp" );
// join the tables
factorDT:type << Set Property( "Link ID", 1 );
dataDT:type << Set Property( "Link Reference", Reference Table( "factor.jmp" ) );
// add formula columns
dataDT << New Column( "p 1", Numeric, "Continuous", Format( "Best", 12 ), Formula( :"parameter1[Type]"n * :parameter1 ) );
dataDT << New Column( "p 2", Numeric, "Continuous", Format( "Best", 12 ), Formula( :"parameter2[Type]"n * :parameter2 ) );
dataDT << New Column( "p 3", Numeric, "Continuous", Format( "Best", 12 ), Formula( :"parameter3[Type]"n * :parameter3 ) );
// force the evaluation to complete
dataDT<<RUNFORMULAS></RUNFORMULAS>
Re: ¿Cómo puedo multiplicar dos tablas juntas?Y si no necesita las fórmulas, podría considerar la multiplicación de matrices por elementos, que puede ser "mejor" o no. En mi MacBook, el siguiente código tardó unos 15 segundos.
NamesDefaultToHere(1);
nr = 10000; // Number of rows
nc = 10000; // Number of Columns
dt1 = AsTable(J(nr, nc, RandomInteger(1, 20)));
dt2 = AsTable(J(nr, nc, RandomUniform(0, 1)));
m1 = dt1 << getAsMatrix;
m2 = dt2 << getAsMatrix;
dtFinal = AsTable(m1 :*</img> m2);
Re: ¿Cómo puedo multiplicar dos tablas juntas?Gracias por su respuesta. Sin embargo, tengo muchas columnas y los nombres de las columnas son complicados. Por lo tanto, quiero escribir un bucle for para crear nuevas columnas. ¿Puede explicar más sobre esta declaración?
Formula( :"parameter1[Type]"n * :parameter1 )
Estoy pensando en escribir un bucle for como este:
</CODE></PRE><PRE class="lia-code-sample language-markup"><CODE>colnames = dataDT << Get Column Names();
nc = ncols(dataDT);
DT = New Table("normalized", New Column("ID", values(dataDT:ID << get values)),
New Column("Type", values(dataDT:Type << get values)));
For(i = 3, i<= nc, i++,
DT << New Column( char( colnames[3]), Numeric, "Continuous", Format( "Best", 12 ), Formula( XXXX ) ));Pero no sé cómo construir la fórmula correctamente. . Me sigue dando errores. ¿Me puedes ayudar?
Gracias.
Re: ¿Cómo puedo multiplicar dos tablas juntas?Gracias, funciona en un pequeño conjunto de datos. Pero tengo millones de filas en la tabla 1 y solo dos filas en la tabla 2. Por lo tanto, quiero evitar crear otra mesa enorme. Si no puedo encontrar una solución mejor, probaré este método.
Re: ¿Cómo puedo multiplicar dos tablas juntas?El bucle no es fácil; Creo que esto lo hará:
// make example tables. **save them** so virtual join works.
factorDT = New Table( "Imported Data 2",
New Column( "Type", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2] ) ),
New Column( "parameter1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1.1, 1.2] ) ),
New Column( "parameter2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0.8, 0.9] ) ),
New Column( "parameter3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1.1, 0.9] ) )
);
factorDT << save( "$temp/factor.jmp" );
dataDT = New Table( "Imported Data",
New Column( "ID", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "Type", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 1, 2, 2] ) ),
New Column( "parameter1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "parameter2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 3, 2, 1] ) ),
New Column( "parameter3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [2, 3, 3, 2] ) )
);
dataDT << save( "$temp/data.jmp" );
originalColumns = dataDT<<GETCOLUMNNAMES></GETCOLUMNNAMES>
- capturar las columnas originales antes de agregar las columnas ocultas con unión virtual
- construya la expresión e usando \! "para escapar de las comillas incrustadas
- use write () para depurar su trabajo, no imprimir
- << RunFormulas es importante para la velocidad; la evaluación de fondo predeterminada de las fórmulas de columna es mucho más lenta