как использовать значение столбца в цикле do макросов SAS - PullRequest
0 голосов
/ 13 февраля 2020

У меня проблема с макросом SAS. Я использовал команду do%% затем l oop в pro c означает, но функция% index использует имя столбца как простую строку, а не как имя столбца. Но нужно проверить значения в столбце.

Вот макрос, который я написал.

%let varlist = mzda mzdy vyplat odmena wage payroll SALARY INSTRUCT PAYMENT;

%macro quickndirty;
    %let it_numb = %sysfunc(countw(&varlist.));

    proc means data=CZ_DATA.TRNS_FNCP_D (keep=DB_CLIENT_ID DB_ACCOUNT PAYMENT_INSTRUCT DT_REP DB_BANK_BIC DB_CLIENT_ID)noprint nway;
        class DB_CLIENT_ID DB_ACCOUNT PAYMENT_INSTRUCT;
        output out= SALARY_P2 (keep = DB_CLIENT_ID DB_ACCOUNT PAYMENT_INSTRUCT _FREQ_ );
        where DT_REP = &report_date. 


    %do i=1 %to &it_numb.;      
        %if %index(PAYMENT_INSTRUCT, %scan(&varlist., &i.))>0 %then
            %do;
                and 1=1
            %end;
        %else %if &i. = &it_numb. %then
            %do;
                and 1=0
                    %put zase 2;
            %end;
%end;
        ;
        run;

%mend;

%quickndirty

образец данных:

DB_CLIENT_ID DB_ACCOUNT PAYMENT_INSTRUCT DT_REP
79325   1387348961  SALARY 01/20    11feb2020
79322   1387355558  SALARY 02/20    11feb2020

кто-нибудь посоветует мне, как изменить код для использования значений из столбца? Код не завершен, потому что я должен сначала решить эту проблему.

Я использовал l oop вместо следующей команды. если у кого-то есть лучшее решение, чем утверждение l oop, можете ли вы дать мне совет? Но это должно быть еще макро. Но это все равно должен быть макрос, один и тот же код будет выполняться несколько раз, и я не хочу копировать один и тот же код снова и снова.

and (PAYMENT_INSTRUCT contains 'mzda' or
     PAYMENT_INSTRUCT contains 'mzdy' or
     PAYMENT_INSTRUCT contains 'vyplat' or
     PAYMENT_INSTRUCT contains 'odmena' or
     PAYMENT_INSTRUCT contains 'wage' or
     PAYMENT_INSTRUCT contains 'payroll' or
     PAYMENT_INSTRUCT contains 'salary')

Спасибо

1 Ответ

2 голосов
/ 13 февраля 2020

Похоже, что для ввода

%let varlist = mzda mzdy vyplat ;

вы хотите сгенерировать этот код:

PAYMENT_INSTRUCT contains "mzda" 
or PAYMENT_INSTRUCT contains "mzdy" 
or PAYMENT_INSTRUCT contains "vyplat"

Итак, ваш макрос логики c должен выглядеть примерно так:

%let sep=;
%do i=1 %to %sysfunc(countw(&varlist));
  &sep PAYMENT_INSTRUCT contains "%scan(&varlist,&i)"
  %let sep=or;
%end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...