usando i nomi delle colonne nei loop<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Cari esperti JMP,
Ho una tabella con molte colonne ripetitive:
A_X1_Y1, A_X1_Y2, ....A_X1_Y99, A_X2_Y1, A_X2_Y99, ...
B_X1_Y1, B_X1_Y2, ....B_X1_Y99, B_X2_Y1, B_X2_Y99, ...
cioè Xi, i=1, 99, Yj, j=1,20,
Se voglio aggiungere più colonne:
C_Xi_Yj = A_Xi_Yj - B_Xi_Yj
C_?, dove C_? = A_? - B_?
Posso usare loop con Xi, Yj o posso usare qualcosa di ancora più astratto, come: C_? = A_?-B_?
Grazie,
Qian
Re: utilizzo dei nomi delle colonne nei loopMi ci vuole un po' per capirlo. È un'idea molto interessante.
Grazie!
-------------------------------------------------- -------------------------------------------------- ------------------------------------
Per tabelle molto grandi una soluzione basata su operazioni su matrici è probabilmente più efficiente.
Un esempio;
// Lo script presuppone che le colonne siano nell'ordine corretto: prima tutte le A poi tutte le B nello stesso ordine
//dt<
n = ncol ( dt ) ;
AB = dt << ottenere come matrice ;
C = AB [ 0 , 1 :: n / 2 ] - AB [ 0 , n / 2 + 1 :: n ] ;
dt << impostare la matrice ( C ) ;
per ( io = 1 , io <= 3 , io ++,
per ( j = 1 , j <= 4 , j ++,
col = Colonna ( n + 1 ) ; col << imposta nome ( "C_X" || car ( io ) || "_Y" || car ( j )) ; n ++
)) ;
Re: utilizzo dei nomi delle colonne nei loopGrazie!
Questo evalinsert aiuta davvero. Ora il codice funziona!
Distinti saluti,
Qian
Re: utilizzo dei nomi delle colonne nei loopPer tabelle molto grandi una soluzione basata su operazioni su matrici è probabilmente più efficiente.
Un esempio;
// Lo script presuppone che le colonne siano nell'ordine corretto: prima tutte le A poi tutte le B nello stesso ordine
//dt<
n = ncol ( dt ) ;
AB = dt << ottenere come matrice ;
C = AB [ 0 , 1 :: n / 2 ] - AB [ 0 , n / 2 + 1 :: n ] ;
dt << impostare la matrice ( C ) ;
per ( io = 1 , io <= 3 , io ++,
per ( j = 1 , j <= 4 , j ++,
col = Colonna ( n + 1 ) ; col << imposta nome ( "C_X" || car ( io ) || "_Y" || car ( j )) ; n ++
)) ;
Re: utilizzo dei nomi delle colonne nei loopControlla la funzione Evalinsert(). Può essere utile quando si specificano formule che dipendono ad es. dal contatore.
Esempio con colonne formula:
// crea una tabella di esempio
dt = nuova tavola ( "test" ) ;
per ( io = 1 , io <= 3 , io ++,
per ( j = 1 , j <= 4 , j ++,
dt << nuova colonna ( "ASCIA" || car ( io ) || "_Y" || car ( j ) , numerico , i valori ([ 5 , 6 ]))
)) ;
per ( io = 1 , io <= 3 , io ++,
per ( j = 1 , j <= 4 , j ++,
dt << nuova colonna ( "B_X" || car ( io ) || "_Y" || car ( j ) , numerico , i valori ([ 2 , 2 ]))
)) ;
// Aggiungi colonne formula
f = espr ( analizzare ( evalinsert ( "ASCIA" || "^car(i)^" || "_Y" || "^car(j)^-B_X" || "^car(i)^" || "_Y" || "^caro(j)^" ))) ;
per ( io = 1 , io <= 3 , io ++,
per ( j = 1 , j <= 4 , j ++,
dt << nuova colonna ( "C_X" || car ( io ) || "_Y" || car ( j ) , numerico , formula ( eval ( f )))
)) ;
Re: utilizzo dei nomi delle colonne nei loopecco le mie prove fallite, qualcuno per favore aiuta:
per ( io = 1, io <= 3, i++,
per ( j = 1, j <=4, j++,
col_new_name="C_"||char(i)||"_"||char(j);
tabella dati (dt_out) << aggiungi più colonne (col_new_name, 1, "Numeric");
parse (col_new_name) << formula ( ascolumn (parse("A_"||char(i)||"_"||char(j)) -
ascolumn (parse("B_"||char(i)||"_"||char(j)));
);
);
Le colonne con i nomi corretti vengono aggiunte alla mia tabella, ma la formula è letteralmente:
parse("A_"||char(i)||"_"||char(j))-parse("B_"||char(i)||"_"||char(j)
Ho anche provato eval(parse (*)), senza 'parse', senza ascolumn, ecc. nessuno funziona.
Per favore aiuto.
Grazie,
Qian