Moltiplicazione di più colonne una per unaHo 20 colonne di dati. Devo moltiplicare ogni colonna con tutte le altre colonne - una per una. Ad esempio, colonna 2 * colonna 3; colonna 2 * colonna 4; colonna 2 * colonna 5 ... colonna 3 * colonna 4, colonna 3 * colonna 5 ... C'è un modo semplice per farlo con JMP?
Grazie per l'aiuto,
Jess
Ri: Moltiplicando più colonne una per unaCiao @Jess ,
Non sono a conoscenza di una moltiplicazione pairwise di questo tipo disponibile in modo interattivo, ma può essere eseguita con uno script semplice. Hai mai lavorato con JSL? Di seguito è riportato un approccio che consente di specificare il numero di colonna con cui iniziare e terminare, e lo script si occupa di creare le colonne del prodotto a coppie. Se non hai usato JSL prima di farmelo sapere, sono lieto di esaminare ulteriormente i dettagli.
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 )[] ) );
)
);
Spero che questo possa essere d'aiuto!
@julian
Ri: Moltiplicando più colonne una per unaÈ possibile ottenere le combinazioni di colonne con nchoosekmatrix (). Se vuoi solo la matrice dei numeri (per qualsiasi motivo) puoi farlo abbastanza rapidamente.
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>