Wie wäre es möglich, denselben Datenfilter dynamisch auf mehrere Tabellen anzuwenden?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hallo alle,
Ich baue derzeit ein Datenanalysetool mit JMP. Grundsätzlich werden wir JMP verwenden, um unserem Kunden die Interaktion mit Simulationsausgaben zu ermöglichen, die mit anderer Software generiert wurden.
Die Simulationsausgabe wird in mehreren Tabellen mit unterschiedlichen Merkmalen, aber denselben Kennungen gespeichert. Beispielsweise enthält eine Tabelle Ausgabewerte, die global einer Simulationsreplikation zugeordnet sind, eine andere Tabelle enthält Ausgaben, die jedem Agenten zugeordnet sind, der in einer Simulationsreplikation vorhanden ist (und hat daher mehrere Zeilen pro Replikation), und eine andere Tabelle enthält möglicherweise Ausgaben für jeden Zeitschritt von jede Simulationsreplikation (also einschließlich vieler Linien pro Replikation). Allen Tabellen gemeinsam sind Spalten mit Bezeichnern und Eingabeparametern.
Nun die Herausforderung: Ich möchte in der Lage sein, einen Datenfilter zu erstellen, der alle Datentabellen gleichzeitig filtert (natürlich geschieht dies auf der Grundlage der Informationen, die sie teilen (z. B. eine Kennung)). Mein zugrunde liegendes Ziel ist es, die Daten im bequemsten Tabellenformat zu organisieren und gleichzeitig Informationen aus verschiedenen Tabellen mithilfe von Grafiken usw. dynamisch darzustellen.
Irgendwelche Gedanken, die Sie haben könnten, lassen Sie es mich bitte wissen!
Danke im Voraus
Betreff: Wie wäre es möglich, denselben Datenfilter dynamisch auf mehrere Tabellen anzuwenden?Die JSL unter:
http://support.sas.com/demosdownloads/downarea_t4.jsp?productID=109646
ist ziemlich alt und (glücklicherweise!) veraltet, seit wir den 'row state handler' hinzugefügt haben (in JMP 10, glaube ich). Dies hat eine Vielzahl von Verwendungsmöglichkeiten, und der folgende Code zeigt, wie Sie es in diesem Fall ausnutzen können.
// ian.cox@jmp.com : 03November2014
// Demo zum Verknüpfen mehrerer untergeordneter Tabellen mit einer übergeordneten Tabelle mithilfe eines Zeilenstatus-Handlers
NamesDefaultToHere ( 1 ) ;
// Erstellen Sie einige Tabellen zur Verwendung
dt1 = NeueTabelle ( "Tabelle 1" ,
NeueSpalte ( "ICH WÜRDE" , Numerisch , Kontinuierlich , Werte (( 1 :: 10 ) ` )) ,
NeueSpalte ( "Antwort" , Numerisch , Kontinuierlich , Formel ( ZufälligNormal ( 0 , 1 )))
) ;
dt2 = NeueTabelle ( "Tabelle 2" ,
NeueSpalte ( "ICH WÜRDE" , Numerisch , Kontinuierlich , Formel ( Zufällige Ganzzahl ( 1 , 5 ))) ,
NeueSpalte ( "Attribut 2" , Numerisch , Kontinuierlich , Formel ( Zufällige Ganzzahl ( 0 , 10 ))) ,
Zeilen hinzufügen ( 20 )
) ;
dt3 = NeueTabelle ( "Tisch 3" ,
NeueSpalte ( "ICH WÜRDE" , Numerisch , Kontinuierlich , Formel ( Zufällige Ganzzahl ( 1 , 11 ))) ,
NeueSpalte ( "Attribut 3" , Numerisch , Kontinuierlich , Formel ( Zufällige Ganzzahl ( 0 , 100 ))) ,
Zeilen hinzufügen ( 30 )
) ;
// Hilfsfunktion:
// Bei einer gegebenen Datentabelle, einer darin enthaltenen Spalte und einigen Werten in dieser Spalte werden alle entsprechenden Zeilen ausgewählt.
// Muss zulassen, dass 'col' numerisch (Zeichen) ist, in diesem Fall ist 'vals' eine Matrix (ist eine Liste).
Wählen Sie Passende Zeilen aus =
Funktion ({ dt , Kol , Wert } ,
Zeilen2auswählen = [] ;
wenn ( IsMatrix ( Wert ) ,
// 'col' ist numerisch
Zum ( ich = 1 , ich <= Nr ( Wert ) , ich ++,
Zeilen2auswählen = VKonkat ( Zeilen2auswählen , dt << GetRowsWhere ( Kol == Wert [ ich ])) ;
)
,
// 'col' ist ein Zeichen
Zum ( ich = 1 , ich <= NIArtikel ( Wert ) , ich ++,
Zeilen2auswählen = VKonkat ( Zeilen2auswählen , dt << GetRowsWhere ( Kol == Wert [ ich ])) ;
)
) ;
dt << Zeilen auswählen ( Zeilen2auswählen ) ;
) ;
// Erstellen Sie einen Zeilenstatus-Handler, der der 'Master'-Tabelle (dt1) zugewiesen wird. Mehrere Zeilenauswahlen zulassen.
PropagateSelectionToOtherTables =
Funktion ({ x } ,
// Abrufen der ausgewählten Zeilen
ausgewählte Zeilen = dt1 << GetSelectedRows ;
Wenn ( Nr ( ausgewählte Zeilen ) > 0 ,
// Holen Sie sich die entsprechenden IDs
Ausweise = dt1 : ICH WÜRDE [ ausgewählte Zeilen ] ;
// Wählen Sie die entsprechenden Zeilen in dt2 aus
Wählen Sie Passende Zeilen aus ( dt2 , Ausdruck ( : ICH WÜRDE ) , Ausweise ) ;
// Wählen Sie die entsprechenden Zeilen in dt3 aus
Wählen Sie Passende Zeilen aus ( dt3 , Ausdruck ( : ICH WÜRDE ) , Ausweise ) ;
,
// Vorhandene Auswahl löschen
dt2 << Auswahl löschen ;
dt3 << Auswahl löschen ;
) ;
) ;
// Den Handler dt1 zuweisen
rsch = dt1 << MakeRowStateHandler ( PropagateSelectionToOtherTables ) ;
Betreff: Wie wäre es möglich, denselben Datenfilter dynamisch auf mehrere Tabellen anzuwenden?Ich habe einen viel effizienteren Weg gefunden, mit dem Problem umzugehen, als meinen ursprünglichen Ansatz.
Um den Zeilenstatus (eingeschlossen und ausgewählt) von dtglobal auf dt1, dt2, dt3 zu übertragen, können Sie Folgendes verwenden, es funktioniert schnell und dynamisch, selbst für große Datentabellen. Alles, was Sie brauchen, ist eine Spalte mit einem entsprechenden 'Schlüssel' (Zahlenwert) in jeder Tabelle.
//Überträgt den Zeilenstatus von dtglobal an andere Tabellen
statehandler = dtglobal << Zeilenzustandshandler erstellen ( statetransfer );
statetransfer = Funktion( {Y},
dt1 << Zeilenzustände löschen;
dt2 << Zeilenzustände löschen;
dt3 << Zeilenzustände löschen;
Excluderows = dtglobal << Ausgeschlossene Zeilen abrufen;
Excludekeys = dtglobal:Key << Werte abrufen;
Ausschlussschlüssel = Ausschlussschlüssel [Ausschlusszeilen];
dt1 << Select Where(Contains(Matrix(excludekeys), :Key));
dt1 << ausschließen;
dt2 << Select Where(Contains(Matrix(excludekeys), :Key));
dt2 << ausschließen;
dt3 << Select Where(Contains(Matrix(excludekeys), :Key));
dt3 << ausschließen;
selectrows = dtglobal << Ausgewählte Zeilen abrufen;
selectkeys = dtglobal:Key << Werte abrufen;
selectkeys = selectkeys[selectrows];
dt1 << Select Where( Contains( Matrix( selectkeys ), :Key ) );
dt2 << Select Where( Contains( Matrix( selectkeys ), :Key ) );
dt3 << Select Where( Contains( Matrix( selectkeys ), :Key ) );
)
;
Betreff: Wie wäre es möglich, denselben Datenfilter dynamisch auf mehrere Tabellen anzuwenden?Vielen Dank für Ihre Antwort PMroz.
Ich habe mit etwas Ähnlichem wie diesem Beispiel experimentiert: http://support.sas.com/demosdownloads/downarea_t4.jsp?productID=109646 .
Ich habe zwei Tabellen erstellt, bei denen der Einschluss-/Ausschlussstatus von Tabelle 2 von dem von Tabelle 1 abhängt (in Zukunft könnte dies erweitert werden, um auch die anderen Status wie ausgewählt, sichtbar, Farbe usw. einzubeziehen).
Leider ist das Ergebnis noch nicht belastbar. Es funktioniert manchmal, aber nach dem Filtern (einschließen/ausschließen) einiger Zeilen oder etwas anderem funktioniert es nicht mehr. Ich vermute, es könnte damit zusammenhängen, welche Datentabelle aktuell ist, aber ich bin mir nicht sicher. Die Verwendung des Skripts, das ich aus dem Skriptfenster geschrieben habe (und nicht in Tabelle1 eingebettet ist), ist etwas robuster, tut aber manchmal immer noch nichts.
Alle Gedanken zur weiteren Verbesserung dieses Ansatzes sind sehr willkommen!
Führen Sie einfach das Skript für die beiden Tabellen im Anhang aus, um sich selbst ein Bild zu machen. Das Skript, das ich zum eigentlichen Verbinden der Tabellen verwende, befindet sich ebenfalls am Ende des Anhangs.
Kurze Zusammenfassung:
Sowohl Tabelle 1 als auch Tabelle 2 haben eine Spalte RepID.
Wenn eine Zeile in Tabelle 1 eingeschlossen/ausgeschlossen ist, tut dies die Spalte :Excluded (aus irgendeinem Grund geht die dt/dt2-Referenz nach dem Starten der Tabellen verloren, daher definiere ich sie hier erneut):
Formel(
Wenn ( Ausgeschlossen (Zeilenstatus (Zeile()) ),
dt = Datentabelle ( "linktable1.jmp" );
dt2 = Datentabelle( "linktable2.jmp" );
Aktuelle Datentabelle (dt);
1;
,
dt = Datentabelle ( "linktable1.jmp" );
dt2 = Datentabelle( "linktable2.jmp" );
Aktuelle Datentabelle (dt);
0;
)
)
),
Dann macht Spalte :parser Folgendes:
If(:Excluded == 1, Eval(Parse(:ScriptEx)), :Excluded == 0, Eval(Parse(:ScriptInc)))
Was sich auf dieses Skript bezieht (in :ScriptEx):
RepIDex = dt:RepID[];
Ausschlussliste = Liste();
Excludelist = As List( dt2 << Zeilen abrufen Where( dt2:RepID == RepIDex ) );
Aktuelle Datentabelle (dt2);
Eval( For( i = 1, i <= N Items( Excludelist ), i++, Row State( Excludelist ) = Ausgeschlossener Staat( 1 ) ) );
Siehe Anhang für das gesamte Skript inkl. Tische.
Betreff: Wie wäre es möglich, denselben Datenfilter dynamisch auf mehrere Tabellen anzuwenden?Ich weiß nicht, ob Sie Dinge gleichzeitig filtern könnten, aber Sie könnten Flag-Spalten zu jeder Tabelle hinzufügen, wobei eine 1 bedeutet, dass diese Zeile einige Kriterien erfüllt, und eine 0 bedeutet, dass dies nicht der Fall ist.