Ihr Code wird auf diese Weise nicht funktionieren, da Sie Datenschrittanweisungen in einem anderen Datenschritt ausgeben. Um diese Art von Dingen zu tun, müssen Sie Dinge anders einrichten. Hier ist, wie es geht.
Lassen Sie uns zunächst ein Dataset namens Spalten erzeugen (als T.BetterSet
Tabelle aufwirft), in dem wir Werte einfügen column1
, column2
und column5
- das heißt, die Spalten möchten wir in Tabellen gleichen repliziert sehen Name später.
data columns;
informat column $32.;
input column;
datalines;
column1
column2
column5
;
Dann werden wir Beispieldaten (die sich als Ihre End.DatasetpreparedForAnalisys
Tabelle), die Spalten column1
-column5
erzeugen. Angesichts des Inhalts der Tabelle columns
werden nur die Spalten 1, 2 und 5 später eigenständige Tabellen.
data sampleData;
informat column1-column5 8.;
input column1-column5;
datalines;
12 -1 2 3 0
-2 -3 -1 0 -3
0 -4 -5 -2 -9
-1 -5 4 2 0
;
Jetzt erklären wir ein Makro %createTable
, die erforderlich alle Anweisungen erteilt werden die Ausgabe-Datensätze für die einzelnen Spalten zu erstellen.
%macro createTable(col);
data &col;
set sampleData;
where &col <= 0;
keep &col;
run;
%mend;
ist All jetzt mit der call execute
Routine einrichten. Mithilfe von call execute
können Sie Anweisungen ausstellen, die wir als "parallelen" Prozess bezeichnen könnten. Das bedeutet, dass die Anweisungen nicht im aktuellen Datenschritt enthalten sind, sondern als eigenständiger Teil der Anweisungen gesendet werden, die von SAS kompiliert und ausgeführt werden. Beachten Sie, dass der Makroaufruf '% createTable' in einfache Anführungszeichen gesetzt wird. Dies ist der Schlüssel, sonst würden Sie Probleme bekommen.
data _null_;
set columns;
call execute(cats('%createTable(', column, ')'));
run;
Das Protokoll zeigt jetzt:
NOTE: There were 3 observations read from the data set WORK.COLUMNS.
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
NOTE: CALL EXECUTE generated line.
1 + data column1; set sampleData; where column1 <= 0; keep column1; run;
NOTE: There were 3 observations read from the data set WORK.SAMPLEDATA.
WHERE column1<=0;
NOTE: The data set WORK.COLUMN1 has 3 observations and 1 variables.
(...)
2 + data column2; set sampleData; where column2 <= 0; keep column2; run;
NOTE: There were 4 observations read from the data set WORK.SAMPLEDATA.
WHERE column2<=0;
NOTE: The data set WORK.COLUMN2 has 4 observations and 1 variables.
(...)
3 + data column5; set sampleData; where column5 <= 0; keep column5; run;
NOTE: There were 4 observations read from the data set WORK.SAMPLEDATA.
WHERE column5<=0;
NOTE: The data set WORK.COLUMN5 has 4 observations and 1 variables.
(...)
So bestätigt, dass
- 3 Beobachtungen von column1 in der neuen Tabelle column1
- 4 Beobachtungen wurden gehalten Form column2 genannt gehalten wurden Die neue Tabelle namens column2
- 4 Beobachtungen wurden von Spalte5 gehalten in der neuen Tabelle namens column5
Warum versuchen Sie, einen Datenschritt in einem anderen auszuführen? Kannst du auch klarstellen, was du meinst, indem du "alle Variablen von einer Spalte an ein Makro übergibst"? Ich sehe nicht, wie das, was du bisher versucht hast, das erreicht. – superfluous
Versuchen Sie, variable Werte oder Variablennamen zu übergeben? – Reeza
Es ist nicht so gemacht. Verwenden Sie die Anrufausführung. http://support.sas.com/documentation/cdl/en/mcrolref/67912/HTML/default/viewer.htm#n1q1527d51eivsn1ob5hnz0yd1hx.htm – Reeza