Mehr zur TeilmengenerstellungHallo, ich beziehe mich auf den Beitrag https://communities.sas.com/message/166376#166376 vom Mai dieses Jahres.
Das Beispiel erklärt, wie Sie eine neue Datentabelle erstellen, indem Sie 1) zuerst einen Datenfilter hinzufügen und 2) dann eine Teilmenge festlegen:
dt = Open (BigClass);
dt << data filter (add filter(columns(:age),where(:age=={12,13}), Mode (select(1)));
sub1 = dt<
Als Ergebnis wird eine Datentabelle mit dem Namen „Regionen“ erstellt. Wie erwartet.
Ich habe ein ähnliches Beispiel mit meinem eigenen Datensatz erstellt (das BigClass-Beispiel funktioniert!!), das für mich nicht gut funktioniert. Ich vermute, dass ich etwas falsch verstanden habe. Hier ist mein Programmablauf beigefügt.
Der Unterschied zwischen dem BigClass-Beispiel und meinem Beispiel besteht darin, dass der Datenfilter nicht ausgewählt wird, wenn ich das gesamte Skript ausführe. (Ich habe auf das Laden der Datei aus einer Excel-Datei verzichtet, um Ihnen den Originalcode zusenden zu können, in dem bestimmte Namen enthalten waren.) Zur Erklärung: Es gibt eine Zeichenspalte, aus der ich nur die Zeilen auswählen möchte, in denen der Text in der Spalte mit „d“ oder „I“ beginnt. Ich hielt es für notwendig, eine neue Spalte zu erstellen, für die der Datenfilter durchgeführt werden soll. Wenn ich den Code insgesamt ausführe, werden die Zeilen NICHT ausgewählt und die Tabelle mit Teilmengendaten wird nicht erstellt. Wenn ich den Code zuerst BIS zur Erstellung der neuen Spalte Onelettet ausführe und DANN den Datenfilter ausführe, wird der Filter erstellt und die Zeilen ausgewählt. Und schließlich wird die Teilmengendatentabelle erstellt. Aber diese Dinge sollten so oder so passieren, wie das Skript ausgeführt wird? ODER?
Dies ist für den Einsatz von Skripten von grundlegender Bedeutung, daher muss ich mir ein tiefes Verständnis dieser Feinheiten aneignen.
Grüße
Poul
Betreff: Mehr zur TeilmengenerstellungAnhand des Beispielcodes von MS finden Sie hier eine direkte Lösung, die sehr robust ist, da die Zeilen in der Datentabelle nicht in den ausgewählten Status wechseln müssen:
dt = Neue Tabelle ( „test“ ,
Zeilen hinzufügen ( 5 ) ,
Neue Spalte ( „Instr“ , Zeichen ,
Werte festlegen ( { "drum" , „Trompete“ , „Leier“ , „Klarinette“ , „Didgeridoo“ } )
)
);
sel = dt << Zeilen abrufen where ( Beginnt mit ( : instr , "d" ) | Beginnt mit ( : instr , "l" ) ) ;
dt << subset ( Ausgabetabellenname ( „sel instr“ ) , Zeilen ( sel ) , ausgewählte Spalten ( 0 ) ) ;
Betreff: Mehr zur TeilmengenerstellungDas Schließen des Datenfilters ist einfach, wenn Sie ihm eine Referenz gegeben haben.
df = dt << Datenfilter ( ... ) ;
df << schließen ;
Betreff: Mehr zur TeilmengenerstellungHallo MS,
Hinzufügen von wait(); Nachdem die Formelauswertung das Problem gelöst hat, dass der Filter nicht gesetzt wurde, bevor der Teilmengenbefehl ausgeführt wurde. Danke schön.
Wie lautet der Befehl zum Schließen des Filterfensters? Ich möchte nicht, dass es nach der Teilmenge auf dem Bildschirm bleibt. Ich möchte nur den Datensatz. Eigentlich muss ich es überhaupt nicht sehen.
Und ja, ich dachte, die Auswahl könnte in einer einzigen Aussage erfolgen. Ich wusste einfach nicht, wie es geht.
Danke
Poul
Betreff: Mehr zur TeilmengenerstellungEs ist schwer zu sagen, warum es in einem bestimmten Fall ohne eine Tabelle zum Testen des Codes nicht funktioniert. Wenn Code von Spaltenformeln abhängt, die im selben Skript erstellt wurden, kann die Formelauswertung meiner Erfahrung nach hinter der Skriptausführung zurückbleiben, was zu unerwarteten Ergebnissen führen kann. Um dies zu vermeiden, kann man versuchen, bei den kritischen Schritten die Formel Wait() oder << eval einzufügen.
In diesem speziellen Fall besteht jedoch, wenn ich es richtig verstehe, keine Notwendigkeit für eine neue Spalte (oder einen Datenfilter). Vielleicht kann das folgende Beispiel hilfreich sein.
//Beispieltabelle
dt = Neue Tabelle ( „test“ ,
Zeilen hinzufügen ( 5 ) ,
Neue Spalte ( „Instr“ , Zeichen ,
Werte festlegen ( { "drum" , „Trompete“ , „Leier“ , „Klarinette“ , „Didgeridoo“ } )
)
);
// Wählen Sie mithilfe eines Datenfilters ein Instr aus, das mit d oder l beginnt
sel = dt << Zeilen abrufen where ( Beginnt mit ( : instr , "d" ) | Beginnt mit ( : instr , "l" ) ) ;
dt << Datenfilter (
Filter hinzufügen ( Spalten ( : instr ) , wobei ( : instr = : instr [ sel ] ) , Modus ( select ( 1 ) ) )
);
dt << subset ( Ausgabetabellenname ( "sel instr" ) , ausgewählte Zeilen ( 1 ) , ausgewählte Spalten ( 0 ) ) ;
// Oder ein direkterer Ansatz ohne Datenfilter
dt << select where ( Beginnt mit ( : instr , "d" ) | Beginnt mit ( : instr , "l" ) ) ;
dt << subset ( Ausgabetabellenname ( "sel instr" ) , ausgewählte Zeilen ( 1 ) , ausgewählte Spalten ( 0 ) ) ;