DatentabellenHallo,
Ich möchte in JMP mehr als zwei Tabellen anhand einer gemeinsamen Spalte vergleichen. Falls die Werte in dieser Spalte in allen Tabellen vorhanden sind, soll eine 1 zurückgegeben werden, andernfalls eine 0. Dies funktioniert bereits für einige vordefinierte Tabellen und mithilfe eines JSL-Skripts, das jeder Tabelle eine zusätzliche Spalte hinzufügt und 0 oder 1 zurückgibt.
Ich möchte das Skript so allgemein gestalten, dass ich die Tabellennamen nicht vordefinieren muss. Es sollte so funktionieren, dass es mich bei jedem Ausführen fragt, welche Tabellen verglichen werden sollen.
Anschließend möchte ich, dass das Skript mir auch die Möglichkeit gibt, die zu vergleichende Spalte auszuwählen.
Aktuell verwende ich dieses Skript.
// Get references to the three tables
dt1 = Data Table("Untitled 9");
dt2 = Data Table("Untitled 10");
dt3 = Data Table("Untitled 11");
// Extract ID values from each table
ids1 = dt1:ID << Get Values;
ids2 = dt2:ID << Get Values;
ids3 = dt3:ID << Get Values;
// Find common IDs manually
commonIDs = {};
For(i = 1, i <= N Items(ids1), i++,
If(Contains(ids2, ids1[i]) & Contains(ids3, ids1[i]),
Insert Into(commonIDs, ids1[i])
)
);
// Function to add indicator column
AddIndicatorColumn = Function({dt},
dt << New Column("PresentInAll",
Numeric,
Formula(If(Contains(commonIDs, :ID), 1, 0))
)
);
// Apply to all tables
AddIndicatorColumn(dt1);
AddIndicatorColumn(dt2);
AddIndicatorColumn(dt3);
Bearbeitet (jthi): JSL-Formatierung hinzugefügt
Ich wähle drei Tabellen aus, die nicht namentlich genannt werden (Untitled 9, Untitled 10 und Untitled 11), und vergleiche die Spalte „ID“.
Bitte helfen Sie mir dabei.
Danke

Automatisierung und SkripterstellungDatenzugriffBetreff: DatentabellenWie viele Zeilen und wie viele eindeutige Werte haben Ihre Tabellen? Dies kann Einfluss darauf haben, wie dies umgesetzt werden sollte, um Leistungsprobleme zu vermeiden.
Betreff: DatentabellenSie können die Benutzeroberfläche mithilfe von „Datentabelle abrufen“ und „Listenfeldern“ erstellen. Unten finden Sie eine Kurzversion, die Ihnen den Einstieg erleichtert.
Names Default To Here(1);
dts = Get Data Table List();
If(N Items(dts) < 2,
Throw("Not enough tables open");
);
run_expr = Expr(
Show(lb_tables << get selected, lb_columns << get selected);
);
tables = dts << get name;
nw = New Window("",
H List Box(
Panel Box("Select tables",
lb_tables = List Box(tables,
<< Set Function(Function({this},
sel = this << get selected;
If(N Items(sel) < 1,
return(0);
);
cols = Datatable(sel[1]) << Get Column Names("String");
lb_columns << Set Items(cols);
))
),
),
Panel Box("Pick Column",
lb_columns = List Box({}, << Set Max Selected(1))
),
Panel Box("Actions",
Lineup Box(N Col(1),
Button Box("OK",
run_expr
),
Button Box("Cancel",
nw << close window;
)
)
)
)
);
Write();
Betreff: DatentabellenHier ist ein ausführlicher JSL-Code, der Jarmos JSL aufgreift und erweitert, um Ihnen die Ergebnisse zu liefern, die Sie in Ihrer ersten Diskussion gezeigt haben.
Es verwendet assoziative Arrays, um die Schnittmenge sowohl der Spaltennamen, die in allen 3 Tabellen vorkommen, als auch der Werte, die in der ausgewählten Spalte vorkommen, zu finden.
Es nutzt außerdem die Update-Plattform, um die Ergebnisse wieder in die ursprünglichen drei Tabellen zu übertragen. Die Methodik dürfte auch bei sehr großen Datentabellen recht effizient sein.

Names Default To Here( 1 );
dts = Get Data Table List();
If( N Items( dts ) < 2,
Throw( "Not enough tables open" )
);
tables = dts << get name;
// Create the table and column selection window
nw = New Window( "",
H List Box(
// Define the Table selection box
Panel Box( "Select tables",
lb_tables = List Box(
tables,
maxselected( 3 ),
<
<SET function="">
0, lb_columns << Set Items( cols ); pickPBox << visibility( "Visible" ); ); ); ) ) ), ), // Define the column selection box pickPBox = Panel Box( "Pick Column", lb_columns = List Box( {}, Max Selected( 1 ), <
<SET function=""></SET>
</SET>
<BR />