Multiplier plusieurs colonnes une par uneJ'ai 20 colonnes de données.Je dois multiplier chaque colonne avec toutes les autres colonnes - une par une.Par exemple, colonne 2 * colonne 3 ; colonne 2 * colonne 4 ; colonne 2 * colonne 5...colonne 3* colonne 4, colonne 3 * colonne 5...Existe-t-il un moyen simple de faire cela avec JMP ?
Merci pour votre aide,
Jesse
Re : Multiplier plusieurs colonnes une par uneVous pouvez obtenir les combinaisons de colonnes avec nchoosekmatrix().Si vous ne voulez que la matrice de nombres (pour une raison quelconque), vous pouvez le faire assez rapidement.
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>Re : Multiplier plusieurs colonnes une par uneSalut @Jess ,
Je ne connais aucune multiplication par paires de ce type disponible de manière interactive, mais cela peut être fait avec des scripts simples. Avez-vous déjà travaillé avec JSL ? Vous trouverez ci-dessous une approche qui vous permet de spécifier le numéro de colonne pour commencer et se terminer, et le script se charge de créer les colonnes de produits par paires. Si vous n'avez pas utilisé JSL auparavant, faites-le moi savoir, je serai heureux de parcourir un peu plus les détails.
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 )[] ) );
)
);
J'espère que ça aide!
@julien