Comparaison de colonnes du même nom entre 2 tables de données<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />J'ai 2 tables de données contenant des colonnes numériques du même nom.
Je souhaite exécuter un script qui comparera les noms de colonnes dans les tables et un identifiant unique dans une ligne. s'ils correspondent, il doit exécuter un calcul simple (% de différence entre les 2 nombres) et renvoyer un autre tableau avec les résultats.
J'ai essayé d'utiliser les tableaux de comparaison mais cela ne permet pas les calculs dont j'ai besoin.
Quelqu'un a-t-il fait quelque chose de similaire que je pourrais utiliser ?
J'ai joint 2 exemples de fichiers au cas où quelqu'un penserait qu'il pourrait m'aider.
David
Re : Comparaison de colonnes du même nom entre 2 tables de donnéesIl existe de nombreuses façons d'automatiser cette procédure à l'aide de jsl. Voici une tentative qui devrait fonctionner pour les deux tables publiées ici. Les noms des tables et la colonne ID sont codés en dur ici mais une boîte de dialogue permettant à l'utilisateur de choisir les tables pourrait facilement être implémentée. Le code doit fonctionner pour n'importe quel nombre ou dénomination de colonnes de substances (cependant, le nombre de colonnes de substances et l'ordre de celles-ci doivent être identiques dans les deux tableaux).
// 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 : Comparaison de colonnes du même nom entre 2 tables de donnéesJ'espère que cela fonctionnera pour vous. Je l'ai obtenu du guide de script jmp8 donc...
Comparez deux tableaux de données
Voici un script pour ouvrir deux tables de données, les comparer et rapporter tous les résultats dans la fenêtre du journal. Ce
Le script fait un usage intensif de l'opérateur For pour boucler les opérations sur toutes les lignes (boucles avec i), imbriquées
avec un autre opérateur For pour boucler les opérations sur toutes les colonnes (boucles avec 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 : Comparaison de colonnes du même nom entre 2 tables de donnéesJe dois le faire assez souvent et je dois parfois regarder environ 200 colonnes, donc un moyen d'automatiser, même semi-automatique, cette procédure est préférable. Si je joins les deux tables, les noms de colonnes ne sont alors pas les mêmes, ce qui rendra probablement toute automatisation plus difficile.
Re : Comparaison de colonnes du même nom entre 2 tables de donnéesje ne sais pas à quelle fréquence vous devez effectuer ce travail.
Je suggérerais simplement de joindre ces deux tableaux et d'utiliser une formule pour effectuer un calcul négatif de chaque ligne de ces 2 colonnes.
en supposant que vos données sont dans une séquence fixe de lignes.