Comparando columnas del mismo nombre entre 2 tablas de datos<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Tengo 2 tablas de datos que contienen columnas numéricas del mismo nombre.
Quiero ejecutar un script que compare los nombres de las columnas en las tablas y un identificador único en una fila. si coinciden, debe ejecutar un cálculo simple (% de diferencia entre los 2 números) y devolver otra tabla con los resultados.
He intentado usar las tablas de comparación, pero esto no permite los cálculos que necesito.
¿Alguien ha hecho algo similar que pueda usar?
He adjuntado 2 archivos de muestra en caso de que alguien sienta que podría ayudarme.
David
Re: Comparar columnas del mismo nombre entre 2 tablas de datosHay muchas formas de automatizar este procedimiento usando jsl. Aquí hay un intento que debería funcionar para las dos tablas publicadas aquí. Los nombres de las tablas y la columna ID están codificados aquí, pero se podría implementar fácilmente un cuadro de diálogo que permita al usuario elegir tablas. El código debería funcionar para cualquier número o denominación de columnas de sustancias (sin embargo, el número de columnas de sustancias y el orden de estas deben ser idénticos en las dos tablas).
// 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] )
);
Re: Comparar columnas del mismo nombre entre 2 tablas de datosEspero que esto funcione para ti. Lo obtuve de la guía de secuencias de comandos jmp8, así que...
Comparar dos tablas de datos
Aquí hay una secuencia de comandos para abrir dos tablas de datos, compararlas e informar todos los resultados a la ventana de registro. Este
La secuencia de comandos hace un uso intensivo del operador For para realizar operaciones de bucle en todas las filas (bucles con i), anidadas
con otro operador For para realizar un bucle de operaciones en todas las columnas (bucles 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.
Re: Comparar columnas del mismo nombre entre 2 tablas de datosTengo que hacer esto con bastante frecuencia y, a veces, tengo que mirar ~ 200 columnas, por lo que se prefiere alguna forma de automatizar, incluso la semiautomatización, este procedimiento. Si uno las dos tablas, los nombres de las columnas no son los mismos, lo que probablemente dificultará cualquier automatización.
Re: Comparar columnas del mismo nombre entre 2 tablas de datosNo estoy seguro de con qué frecuencia tienes que hacer este trabajo.
Sugeriría simplemente unir estas dos tablas y usar la fórmula para hacer un cálculo negativo de cada fila de estas 2 columnas.
asumiendo que sus datos están en una secuencia fija de filas.