SAS макросы несколько операторов - PullRequest
0 голосов
/ 07 ноября 2019

Я начну с некоторого примера. У меня есть переменная «школы», например «Гарвард и Оксфорд», «только Гарвард» и т. Д. Я хочу найти переменную «школы» только в тех случаях, которые содержат только одно название школы (переменная «место»). У меня есть переменная «place» в наборе данных «bbb», которую я помещаю в listplace («harvard! Oxford! Wse»), переменная «мнение», которую я помещаю в «листопинион» («8! 8! 9), и переменная« страна », которую я помещаю в listcountry( "США! ик! Франция"). Я хочу сделать макрос, который находит в «школах» переменную только этих случаев, которая содержит два школьных названия (zm1). Затем я хочу добавить к ним соответствующий пункт из списка и списка. «Место» - это название школы, «мнение» - это средний показатель, а «страна» - источник этого показателя.

Это мой первый набор данных: «Место» - «Гарвард» 8 «США» - «Оксфорд» 8"uk" - "wse" 9 "Франция"

Это мой второй набор данных:

школы - лучше всего Гарвард - должен быть выбран только Гарвард - у нас нет никаких значений - торт

Это то, что я хочу получить в качестве результатов моего кода (только два наблюдения, а не четыре, как в переменной "школы"):

страна мнения школы - "Гарвард очень особенный" 8 "США"-" должен быть выбран только гарвард "8" сша "

Как я могу заставить три% делать до тех пор, пока не получится цикл с операторами% let?

    data aaa;
    input  schools;
    datalines;
    "harvard and oxford"
    "only harvard should be chosen"
    "cheese, cake, pizza"
    "we dont't have any values"
    ;
    run;
    data bbb;
    input  place opinion country;
    datalines;
    "harvard" 8 "usa"
    "oxford" 8 "uk"
    "wse" 9 "france"
    ;
    run;
    data ccc;
    set
    proc sql noprint;
    select opinion
    into :listopinion separated by "!"
    from aaa
    ;
    run;
    quit;
    proc sql noprint;
    select country
    into :listcountry separated by "!"
    from aaa
    ;
    run;
    quit;
    proc sql noprint;
    select place
    into :listplace separated by "!"
    from aaa
    ;
    run;
    quit;
    %let i_1 =1;
    %let i_2 =1;
    %let i_2 =1;
    %do %until (%qscan(&listplace,&i_1,'!') = %str());
             %do %until (%qscan(&listopinion,&i_2,'!') = %str());
                      %do %until (%qscan(&listcountry,&i_3,'!') = %str());                
                          %let zm1=%scan(&listplace,&i_1,'!');
                               find(school,"&zm1")=1 or
                          %let zm2=%scan(&listopinion,&i_2,'!')
                          %let zm3=%scan(&lista3,&i_3,'!');
                          %let i_3=%eval(&i_3+1);
                      %end;
                 %let i_2=%eval(&i_2+1);
             %end;
        %let i_1=%eval(&i_1+1);
    %end;
    run;

1 Ответ

0 голосов
/ 07 ноября 2019

Похоже, что для вашего теста школы вы хотите проверить, существуют ли два или более имен в списке в значении школы.

Так что если ваш список школ для поиска выглядит так:

%let list=harvard|oxford|wse;

, то вы хотите сгенерировать что-то вроде:

if sum( 0<findw(school,"harvard",,'i')
      , 0<findw(school,"oxford",,'i')
      , 0<findw(school,"wse",,'i')
      ) >= 2 then do;
...
end;

Так что вы можете использовать что-то вроде этого:

if sum(

%let sep=;
%do i=1 %to %sysfunc(countw(&list,|));
  &sep  0<findw(school,"%qscan(&list,&i,|)",,'i')
  %let sep=,;
%end;

) >= 2 then do;
...
end;

Понятия не имею, что вы хотите сделать с двумя другими списками. Я думаю, что вы хотите использовать их для генерации некоторого кода SAS, где я оставил ....

...