【发布时间】:2016-06-03 19:48:56
【问题描述】:
我希望能够为一组不连续的值执行一个 do 循环。我编写此代码的方式为每个值运行一个新的数据步骤 - 因此最终产品是一个数据表,其中仅为 do 循环的最终值添加了一个列。我想要的是 varlst 中的值循环遍历 if/then 语句 - 从而向表中添加多个列 - 而无需每次都执行新的数据步骤(这只导致向表中添加最后一列)。
输入数据
DATA have;
INPUT id order Q3 Q5 Q6 Q50 Q75 Q102;
DATALINES;
1 1 2 0 7 2 2 0
1 2 3 0 5 5 3 0
3 1 6 1 7 2 7 1
3 2 6 0 7 5 7 0
6 1 3 1 4 7 7 2
6 2 5 2 7 7 7 1
7 1 3 5 6 5 3 0
7 2 4 1 7 5 2 1
9 1 4 1 6 5 6 1
9 2 1 3 5 7 5 0
;
run;
/********/
%macro test;
%let varlst=2 3 5 6 50 75 102 /*more values*/;
%do i=1 %to %sysfunc(countw(&varlst));
%let value=%scan(&varlst,&i);
data want;
set have;
by id order;
if Q&value ne lag(Q&value) and not first.id then do;
Q&value.Equal = 0;
end;
if Q&value=lag(Q&value) and not first.id then do;
Q&value.Equal = 1;
end;
%end;
run;
%mend;
%test;
/**********/ 输出
id order Q3 Q5 Q6 Q50 Q75 Q102 Q102Equal
1 1 2 0 7 2 2 0 .
1 2 3 0 5 5 3 0 1
3 1 6 1 7 2 7 1 .
3 2 6 0 7 5 7 0 0
6 1 3 1 4 7 7 2 .
6 2 5 2 7 7 7 1 0
7 1 3 5 6 5 3 0 .
7 2 4 1 7 5 2 1 0
9 1 4 1 6 5 6 1 .
9 2 1 3 5 7 5 0 0
【问题讨论】:
-
你能更好地解释你想要做什么吗?您的代码被编写为生成许多数据步骤,这些步骤将一遍又一遍地覆盖相同的数据集。如果您只想对一组值使用数据步骤 DO 循环,那么数据步骤直接支持并且不需要任何宏逻辑。
do value = 2,3,5,6,50,75,102; -
发布示例输入和输出数据。很难判断你是有很多变量还是一个变量有很多值。
-
我对上面的帖子进行了编辑,以显示一些输入数据和输出。我要做的是确定两个编码员(顺序 1 和 2)是否对每个调查(ID)的问题(Q3、Q5 等)给出相同的评分。这就是我使用滞后功能的原因。我试图为这个任务编写一个宏,因为我有很多问题要比较(比这里表示的要多),而且我不想输入那么多行代码(以减少错误)。如输出所示,我只能按照现在的编写方式获得最终问题比较的输出。感谢您的帮助。
标签: loops sas-macro nonsequential