【发布时间】:2019-11-07 12:11:15
【问题描述】:
我从一些例子开始。我有“学校”变量,如“哈佛和牛津”、“仅哈佛”等。我想在“学校”变量中找到仅包含一个学校名称(“地点”变量)的这些案例。我在数据集 bbb 中有“place”变量,我放入 listplace(“harvard!oxford!wse),“opinion”变量,我放入 listopinion(“8!8!9)和“country”变量,我放入 listcountry (“美国!英国!法国”)。我想制作仅在包含两个学校名称(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;
【问题讨论】:
-
欢迎来到 Stack Overflow 并感谢您发布您拥有的代码。请编辑您的问题以显示我们可以复制和粘贴以复制问题的代码,并请说明问题是什么,例如,从日志中复制一条错误消息,或者您得到的值是否与您的预期不同,其中案例说明您的期望和实际得到的。应该都有帮助。
-
请参阅How do I ask a good question 以帮助改进您的问题。
-
无需手动增加循环计数器。
%do &i_sel1 = 1 %to %sysfunc(countw(&lista1,!));。不要在不需要的地方添加引号。您是否打算在扫描列表宏变量时将'或|视为分隔符?还是您只是打算使用|作为唯一的分隔符? -
您要查找同时具有 list1 和 list2 项目的学校吗?或者您只是想查找 list1 或 list2 中的学校?如果是后者,则不要嵌套 %DO 循环。如果是前者,那么列表是否按位置匹配?所以 list1 中的第一项链接到 list2 中的第一项。还是要将 list1 中的第一个项目与 list2 中的每个项目配对?
-
也许更多代码会有所帮助。看起来这是使用宏没用的一个例子。