Multiplicando múltiples columnas una por unaTengo 20 columnas de datos. Necesito multiplicar cada columna con todas las demás columnas, una por una. Por ejemplo, columna 2 * columna 3; columna 2 * columna 4; columna 2 * columna 5 ... columna 3 * columna 4, columna 3 * columna 5 ... ¿Existe una manera fácil de hacer esto con JMP?
Gracias por tu ayuda,
Cadena
Re: Multiplicando columnas múltiples una por unaHola @Cadena ,
No tengo conocimiento de ninguna multiplicación por pares de ese tipo disponible de forma interactiva, pero se puede hacer con algunos scripts sencillos. ¿Has trabajado con JSL? A continuación se muestra un enfoque que le permite especificar el número de columna para comenzar y terminar con, y el script se encarga de hacer las columnas de productos por pares. Si no has usado JSL antes, avísame, estoy feliz de repasar los detalles un poco más.
dt = Open( "$SAMPLE_DATA\US Demographics.jmp" );
startCol = 5;
endCol = 14;
For( i = startCol, i <= endCol - 1, i++,
For( j = i + 1, j <= endCol, j++,
colName = Eval( :Column( i ) << Get Name ) || " * " || Eval( :Column( j ) << Get Name );
New Column( colName, seteachvalue( :Column( i )[] * :Column( j )[] ) );
)
);
¡Espero que esto ayude!
@Julian
Re: Multiplicando columnas múltiples una por unaPuede obtener las combinaciones de columnas con nchoosekmatrix (). Si solo quieres la matriz de números (por cualquier razón) puedes hacerlo bastante rápido.
Names Default to Here( 1 );
dt = new table("Test",
add rows(20),
New Column("C", <<SET each="" value=""> 14,
dt << Delete Column(15::ncols(dt));
);
cols_to_multiply = 2::14;
n = nitems(cols_to_multiply);
nck_mat = nchoosekmatrix(n, 2); // this only picks 2 of each combination
// if you just want a matrix
st = HPTime();
dt_mat = dt[0, cols_to_multiply]; //get the values as a matrix
big_mat = dt_mat[0, nck_mat]; // get the combinations of dt values
m_mat = shape(big_mat, nitems(big_mat)/2); // have to shape this to only 2 columns so you can multiply accross
m_mat = shape(m_mat[0, 1] :*</img> m_mat[0, 2], 20); // multiply together then reshape to n rows
tot_mat = HPTime() - st;
//turning it into a data table
st = HPTIme();
nck_cols = shape(cols_to_multiply[nck_mat], nrows(nck_mat), 2);// to get the column names
for(i=1, i<=ncols(m_mat), i++,
col_name = (Column(dt, nck_cols[i, 1]) << Get Name()) || " * " || (Column(dt, nck_cols[i, 2])<< Get name());
New Column(col_name, <<SET values=""></SET></SET>