Confronto di colonne con lo stesso nome tra 2 tabelle di dati<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ho 2 tabelle dati che contengono colonne numeriche con lo stesso nome.
Voglio eseguire uno script che confronterà i nomi delle colonne nelle tabelle e un identificatore univoco in una riga. se corrispondono, dovrebbe eseguire un semplice calcolo (% di differenza tra i 2 numeri) e restituire un'altra tabella con i risultati.
Ho provato a utilizzare le tabelle di confronto ma questo non consente i calcoli di cui ho bisogno.
Qualcuno ha fatto qualcosa di simile che potrei usare?
Ho allegato 2 file di esempio nel caso qualcuno ritenga di potermi aiutare.
Davide
Ri: Confronto di colonne con lo stesso nome tra 2 tabelle di datiEsistono molti modi per automatizzare questa procedura utilizzando jsl. Ecco un tentativo che dovrebbe funzionare per le due tabelle pubblicate qui. I nomi delle tabelle e la colonna ID sono codificati qui, ma è possibile implementare facilmente una finestra di dialogo che consenta all'utente di scegliere le tabelle. Il codice dovrebbe funzionare per qualsiasi numero o denominazione di colonne di sostanze (tuttavia il numero di colonne di sostanze e il loro ordine devono essere identici nelle due tabelle).
// Define table variables, dt1, the table with least number of rows used as reference
dt1 = Data Table( "List Report -1.jmp" );
dt2 = Data Table( "List Report -2 rows.jmp" );
// Define id columns
idcol1 = Column( dt1, 1 );
idcol2 = Column( dt2, 1 );
//Get matching rows
m = J( N Row( dt1 ), 2, . );
For( i = 1, i <= N Row( dt1 ), i++,
mi = dt2 << get rows where( idcol2[] == idcol1[i] );
If( N Row( mi ) > 0,
m[i, 2] = mi[1]
);
m[i, 1] = i;
);
//Make matrix with differences for between matching rows for each substance (edit this formula to get e.g. %)
diff = (dt1 << get asmatrix)[m[0, 1], 0] - (dt2 << get asmatrix)[m[0, 2], 0];
// Put matrix into a new table
dt_diff = New Table( "Difference of matched", New Column( "Matched Substance Identifier", character, values( idcol1[m[0, 1]] ) ) );
dt_diff << set matrix( diff );
//Set column names
colnames = dt1 << get column names( string );
For( i = 2, i <= N Items( colnames ), i++,
Column( dt_diff, i ) << set name( colnames[i] )
);
Ri: Confronto di colonne con lo stesso nome tra 2 tabelle di datiSpero che questo funzioni per te. L'ho preso dalla guida allo scripting jmp8 quindi...
Confronta due tabelle di dati
Ecco uno script per aprire due tabelle di dati, confrontarle e riportare tutti i risultati nella finestra di registro. Questo
Lo script fa un uso intensivo dell'operatore For per eseguire ciclicamente le operazioni su tutte le righe (loop con i), nidificate
con un altro operatore For per eseguire ciclicamente le operazioni su tutte le colonne (loop con j).
/* COMPARE THE CONTENTS OF TWO DATA TABLES */
// First identify the two data tables to be compared.
// Since you don't specify arguments, Open() presents the
// host-system dialog box for opening a file.
caption("Please locate the first data table.",spoken(1));
dt1=open();
caption("Please locate the second data table.");
dt2=open();
// Check for differing sizes.
if(nrow(dt1)!=nrow(dt2),
write("Differing number of rows. "),
write("Same number of rows. "));
if(ncol(dt1)!=ncol(dt2),write("Differing number of columns. "),
write("Same number of columns. "));
nr = min(nrow(dt1),nrow(dt2));
nc = min(ncol(dt1),ncol(dt2));
// Check for differing column names.
for(j=1,j<=nc,j++,
current data table(dt1);n1=char(ColumnName(j));
current data table(dt2);n2=char(ColumnName(j));
if(n1!=n2,
write("\!rDiffering column names in column "||char(j));
show(n1,n2)));
// check for differing values
e=0;
for(i=1,i<=nr,i++,
for(j=1,j<=nc,j++,
v1 = Column(dt1,j);
v2 = Column(dt2,j);
if(v1!=v2,
write("\!rDiffering values at row "||char(i)||
" in column "||char(j));show(v1,v2);e++)));
if(e==0,
write("Matching cells have the same values."),
write("\!rNumber of cells that exist in both tables ");
write("and have differing values: "||char(e)));
// check for differing row states
for(i=1,i<=nr,i++,
current data table(dt1);r1 = char(rowstate(i));
current data table(dt2);r2 = char(rowstate(i));
if(r1!=r2,
write("\!r\!rDiffering row states at row "||char(i));
show(r1,r2)));
//Observe how Current Data Table is used to switch between two open windows.
Ri: Confronto di colonne con lo stesso nome tra 2 tabelle di datiDevo farlo abbastanza spesso e talvolta devo esaminare circa 200 colonne, quindi questa procedura è preferibile in qualche modo per automatizzare, anche semi-automazione. Se unisco le due tabelle insieme, i nomi delle colonne non saranno gli stessi, il che probabilmente renderà più difficile l'automazione.
Ri: Confronto di colonne con lo stesso nome tra 2 tabelle di datinon sono sicuro di quanto spesso devi fare questo lavoro.
Suggerirei semplicemente di unire queste due tabelle e di utilizzare la formula per eseguire un calcolo negativo di ciascuna riga di queste 2 colonne.
presupponendo che i tuoi dati siano in una sequenza fissa di righe.