Определите фильтр с переменной в шаге данных с помощью do loop- SAS
Доброе утро, у меня есть эта проблема.
Есть 2 набора данных
Набор данных "Идентификатор клиента", где у меня есть это:
id | Customer Name |
-----------------------------
123456 | Michael One |
123123 | George Two |
123789 | James Three |
и второй набор данных с именем "транзакция":
id | Transaction | Date
-----------------------------------
123456 | Fuel | 01NOV2018
123456 | Fuel | 03NOV2018
123123 | Fuel | 10NOV2018
123456 | Fuel | 25NOV2018
123123 | Fuel | 13NOV2018
123456 | Fuel | 10DEC2018
123789 | Fuel | 1NOV2018
123123 | Fuel | 30NOV2018
123789 | Fuel | 15DEC2018
результаты, которые я хочу получить, - это создать 3 дБ, как идентификатор 3 клиента, который я нашел в первом наборе данных с именем:
_01NOV2018_15NOV_123456_F
_01NOV2018_15NOV_123123_F
_01NOV2018_15NOV_123789_F
который содержит:
For _01NOV2018_15NOV_123456_F :
id | Transaction | Date
-----------------------------------
123456 | Fuel | 01NOV2018
123456 | Fuel | 03NOV2018
For _01NOV2018_15NOV_123123_F :
id | Transaction | Date
-----------------------------------
123123 | Fuel | 10NOV2018
123123 | Fuel | 13NOV2018
For _01NOV2018_15NOV_123789_F
empty
Мне нужно создать переменную для предложения, где в шаге данных... как я могу это сделать?
Спасибо за помощь!:)`
2 ответа
Вы можете сделать это с помощью небольшого макроса или просто быстрого фильтра в вашем коде экспорта.
proc export data=sashelp.class (where=(sex='F')) outfile='/folders/myfolders/females.xlsx' dbms=xlsx replace; run;
proc export data=sashelp.class (where=(sex='M')) outfile='/folders/myfolders/females.xlsx' dbms=xlsx replace; run;
Или вы можете преобразовать это в небольшой макрос:
%macro exportData(group=);
proc export data=sashelp.class (where=(sex="&group."))
outfile="C:\_localdata\&group..xlsx"
dbms=xlsx
replace;
run;
%mend;
*create list of unique elements to call the macro;
proc sort data=sashelp.class nodupkey out=class;
by sex;
run;
*call the macro once for each group;
data test;
set class;
str = catt('%exportData(group=', sex, ');');
call execute(str);
run;
HASH
OUTPUT
Метод является единственным способом создания динамически именуемого выходного набора данных во время выполнения шага DATA. Согласно комментариям к вопросу, вы, скорее всего, НЕ хотите разбивать свой исходный набор данных на множество частей с именами контента. Независимо от того, как процесс, в SAS, известен как расщепление.
Вы гораздо лучше учитесь применять WHERE
заявление и BY
групповая обработка по шагам DATA и PROC.
Требуемый результат представляется разделенным или классифицированным по половинкам месяца. Вы могли бы лучше всего обслуживать, вычисляя новый semimonth
переменная, содержащая подходящее категориальное значение, а затем использующая этот нисходящий поток, например, в PROC PRINT
,
data customers;
infile cards dlm='|';
attrib
id length=8
name length=$20
;
input id name ;
datalines;
123456 | Michael One |
123123 | George Two |
123789 | James Three |
run;
data transactions;
infile cards dlm='|';
attrib
id length=8
transaction length=$10
date length=8 format=date9. informat=date9.
;
input id transaction date;
datalines;
123456 | Fuel | 01NOV2018
123456 | Fuel | 03NOV2018
123123 | Fuel | 10NOV2018
123456 | Fuel | 25NOV2018
123123 | Fuel | 13NOV2018
123456 | Fuel | 10DEC2018
123789 | Fuel | 1NOV2018
123123 | Fuel | 30NOV2018
123789 | Fuel | 15DEC2018
run;
proc sort data=customers;
by id;
proc sort data=transactions;
by id date;
* merge datasets and compute semimonth;
data want;
merge transactions customers;
by id;
semimonth = intnx('month',date,0) + 16 * (day(date) > 15);
attrib semimonth
format=date9.
label="Semi-month"
;
run;
* process data by semimonth and id, restricting with where;
proc print data=want;
by semimonth id;
where semimonth = '01NOV2018'D;
run;