SAS宏多语句

SAS宏多语句,sas,sas-macro,Sas,Sas Macro,我从一些例子开始。我有“schools”变量,如“harvard and oxford”、“only harvard”等。我想在“schools”变量中只找到这些只包含一个学校名称的案例(“place”变量)。我在数据集bbb中有一个“place”变量,我把它放在listplace(“哈佛!牛津!wse”),“opinion”变量放在listopinion(“8!8!9”)和“country”变量放在listcountry(“美国!英国!法国”)。我想使“schools”变量中的宏只包含两个学校

我从一些例子开始。我有“schools”变量,如“harvard and oxford”、“only harvard”等。我想在“schools”变量中只找到这些只包含一个学校名称的案例(“place”变量)。我在数据集bbb中有一个“place”变量,我把它放在listplace(“哈佛!牛津!wse”),“opinion”变量放在listopinion(“8!8!9”)和“country”变量放在listcountry(“美国!英国!法国”)。我想使“schools”变量中的宏只包含两个学校名称(zm1)的情况。然后,我想向它们添加来自listopinion和listplace的适当项。 “地点”是学校名称,“意见”是平均比率,“国家”是该比率的来源

这是我的第一个数据集: 地方意见国家 -“哈佛”8“美国” -“牛津”8“英国” -“wse”9“法国”

这是我的第二个数据集:

学校 -哈佛最佳 -只有哈佛应该被选中 -我们没有任何价值观 -蛋糕

这就是我想要的代码结果(只有两个观察值,而不是“学校”变量中的四个):

学校意见国家 -“哈佛非常特别”8“美国” -“只有哈佛应该被选为”8“美国”

如何使用%let语句生成三个%do-until循环

    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;

这听起来像是在你的学校测试中,你想测试列表中的两个或两个以上的名字是否存在于学校值中

因此,如果要查找的学校列表如下所示:

%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和(0欢迎使用Stack Overflow,感谢您发布您的代码。请编辑您的问题,以显示我们可以通过复制和粘贴来复制问题的代码,并请指定问题所在,例如,从日志中复制错误消息,或者您是否得到与预期不同的值,在这种情况下,请说出您预期的内容以及t您实际得到了。这应该会有帮助。请参阅以帮助改进您的问题。无需手动增加循环计数器。
%do&i_sel1=1%到%sysfunc(countw(&lista1,!)
。不要在不需要引号的地方添加引号。在扫描列表宏变量时,您是否打算将
'
|
视为分隔符?还是只打算使用
作为唯一的分隔符?是否要查找同时包含列表1和列表2项的学校?还是只想查找schlist1或list2中的ool?如果后者不嵌套%DO循环。如果前者,则列表按位置匹配?因此list1中的第一个项目链接到list2中的第一个项目。或者是否要将list1中的第一个项目与list2中的每个项目配对?也许更多代码会有所帮助。看起来这是关于wh的一个示例是的,这部分是我想要的。对于这段代码的结果,我必须添加“意见”和“国家”变量。我不知道将它们放入列表是否是一个好主意(当我这样做时,我在所有情况下都有“意见”=1和“国家”=1)。我是否应该将它们视为宏观变量?意见列表和国家列表与学校列表有何关联?也许学校列表实际上是一个列表列表?您可以使用两个不同的分隔符来完成此操作。例如,您可以使用
,作为一个分隔符,而
|
作为另一个分隔符:
list1=MSU,OSU,PENNST | LSU,FLORIDA,GEORGIA
“Schools”变量只是一个非常不同的示例列表(有时像“cheese,蛋糕,pizza”一样,有什么不对,那就是我必须使用“place”变量来添加特殊条件),它们可以是相关的,也可以是无关的。“place”,“opinion”和“国家”来自同一数据集“学校”“是另一个。这是否意味着您希望将它们包括在生成的测试系列中,但测试不同的数据集变量?应该很容易。同样,首先写出您要生成的实际SAS代码,然后考虑如何使用宏逻辑生成。您是说测试是(列表1中的两个或更多学校)的组合?”和(国家在清单2中)和(地点在清单3中)?如果是这样,当满足该条件时,您想做什么?
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;