我想处理变量中以逗号分隔的值列表(例如 Q8)并创建相应的响应变量(Q8_1、Q8_2、...、Q8_17)。对于列表中的每个值,如果有值,我想将相应的响应变量设置为 1。如果该值缺失,则相应的响应变量应保留为空。以下是变量最初的样子的示例:
Q8
11
.
.
.
15,17
.
11,12,13,14,15
1,2,3,4,5,6,7,8,9,10
11
我尝试了类似的方法,但它没有正确计算 10+ 的值。有什么建议么?我并没有接受这个代码,所以如果有人有完全不同的代码,我可以接受。
data numeric2;
set numeric;
run;
%macro initial2(var, num);
data numeric2;
format &var._1 - &var._&num 8.;
set numeric2;
run;
%mend;
%macro pop_var(var, num);
data numeric2;
set numeric2;
if index(&var, "&num")>0 then &var._&num = 1;
run;
%mend pop_var;
%macro run_pop(var2, num2);
%initial2(&var2, &num2);
%do i = 1 %to &num2;
%pop_var(&var2, &i);
%end;
%mend;
%run_pop(Q8, 17);`
下面的宏将创建一系列变量,如果在列表中则为 1,如果不在列表中则为 0。例如:
11 --> Q8_11 = 1
12 --> Q8_12 = 1
下面的宏的工作方式是首先循环所有逗号分隔的值并找到最大值。这将让您创建一个动态大小的数组。从那里,我们执行一个数据步骤,创建一个恰好需要大小的数组。我们循环遍历逗号分隔列表中的每个值,并将其相应的数组变量设置为 1。
您所需要的是:
%macro create_vars(data=, out=, var=);
/* Dynamically identify the max value in the data */
data _null_;
set have end=eof;
where NOT missing(&var);
retain max_value 1;
do i = 1 to countw(&var);
value = input(scan(&var, i), 8.);
if(value > max_value) then max_value = value;
end;
if(eof) then call symputx('max_value', max_value);
run;
data &out;
set &data;
array &var._[&max_value];
do i = 1 to countw(&var);
j = input(scan(&var, i), 8.);
&var._[j] = 1;
end;
drop i j;
run;
%mend;
%create_vars(data=have, out=want, var=Q8);