Определите фильтр с переменной в шаге данных с помощью do loop-SAS - PullRequest
0 голосов
/ 31 января 2019

Доброе утро, у меня есть эта проблема.

есть 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 ]

0 голосов
/ 04 февраля 2019

Вы можете сделать это с помощью небольшого макроса или просто быстрого фильтра в вашем коде экспорта процедур.

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;
0 голосов
/ 31 января 2019

Метод 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;

enter image description here

...