Vergleichen gleichnamiger Spalten zwischen zwei Datentabellen<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ich habe zwei Datentabellen, die numerische Spalten mit demselben Namen enthalten.
Ich möchte ein Skript ausführen, das die Spaltennamen in den Tabellen und einen eindeutigen Bezeichner in einer Zeile vergleicht. Wenn sie übereinstimmen, sollte eine einfache Berechnung durchgeführt werden (% Differenz zwischen den beiden Zahlen) und eine weitere Tabelle mit den Ergebnissen zurückgegeben werden.
Ich habe versucht, die Vergleichstabellen zu verwenden, aber diese ermöglichen nicht die Berechnungen, die ich benötige.
Hat jemand etwas Ähnliches gemacht, das ich gebrauchen könnte?
Ich habe zwei Beispieldateien angehängt, für den Fall, dass jemand das Gefühl hat, dass er mir helfen könnte.
David
Betreff: Vergleichen von Spalten mit demselben Namen zwischen zwei DatentabellenEs gibt viele Möglichkeiten, diesen Vorgang mithilfe von JSL zu automatisieren. Hier ist ein Versuch, der für die beiden hier veröffentlichten Tabellen funktionieren sollte. Die Namen der Tabellen und die ID-Spalte sind hier fest codiert, aber ein Dialog, der dem Benutzer die Auswahl von Tabellen ermöglicht, könnte leicht implementiert werden. Der Code sollte für jede beliebige Anzahl oder Benennung von Stoffspalten funktionieren (die Anzahl der Stoffspalten und deren Reihenfolge müssen jedoch in den beiden Tabellen identisch sein).
// 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] )
);
Betreff: Vergleichen von Spalten mit demselben Namen zwischen zwei DatentabellenIch hoffe, das funktioniert für Sie. Ich habe es aus der JMP8-Skriptanleitung erhalten, also ...
Vergleichen Sie zwei Datentabellen
Hier ist ein Skript, um zwei Datentabellen zu öffnen, sie zu vergleichen und alle Ergebnisse im Protokollfenster zu melden. Das
Das Skript nutzt den For-Operator intensiv, um verschachtelte Schleifenoperationen über alle Zeilen (Schleifen mit i) durchzuführen
mit einem anderen For-Operator, um Operationen über alle Spalten zu schleifen (Schleifen mit 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.
Betreff: Vergleichen von Spalten mit demselben Namen zwischen zwei DatentabellenIch muss das ziemlich oft machen und manchmal muss ich mir etwa 200 Spalten ansehen, daher ist eine Möglichkeit zur Automatisierung, sogar zur Halbautomatisierung, dieses Verfahren zu bevorzugen. Wenn ich die beiden Tabellen zusammenfüge, sind die Spaltennamen nicht identisch, was die Automatisierung wahrscheinlich erschweren wird.
Betreff: Vergleichen von Spalten mit demselben Namen zwischen zwei DatentabellenIch bin mir nicht sicher, wie oft Sie diese Arbeit erledigen müssen.
Ich würde vorschlagen, einfach diese beiden Tabellen zu verbinden und mithilfe der Formel eine Minusberechnung für jede Zeile dieser beiden Spalten durchzuführen.
Vorausgesetzt, Ihre Daten liegen in einer festen Zeilenfolge vor.