我想基于跨多个变量为真的条件创建一个新的变量“类型”,但是我有太多的变量(〜100)无法键入。我正在使用SAS Studio v 9.4。
我的数据设置与此类似:
DATA have;
INPUT id
a_var_a a_var_b a_var_c a_var_d a_var_e
b_var_a b_var_b b_var_c b_var_d
c_var_a c_var_b c_var_c d_var_d;
DATALINES;
01 1 0 0 0 0 0 0 0 0 0 0 0 0
02 0 1 0 0 0 0 0 0 0 0 0 0 0
03 0 0 1 0 0 0 0 0 0 0 0 0 0
04 0 0 0 1 0 0 0 0 0 0 0 0 0
05 0 0 0 0 1 0 0 0 0 0 0 0 0
06 0 0 0 0 0 1 0 0 0 0 0 0 0
07 0 0 0 0 0 0 1 0 0 0 0 0 0
08 0 0 0 0 0 0 0 1 0 0 0 0 0
09 0 0 0 0 0 0 0 0 1 0 0 0 0
10 0 0 0 0 0 0 0 0 0 1 0 0 0
11 0 0 0 0 0 0 0 0 0 0 1 0 0
12 0 0 0 0 0 0 0 0 0 0 0 1 0
13 0 0 0 0 0 0 0 0 0 0 0 0 1
;
Run;
“类型”的编码为:
我认为这很简单:
Data want;
Set have;
If a_var: = 1 then type = 1;
Else If b_var: = 1 then type = 2;
Else If c_var: = 1 then type = 3;
Else type = 0;
Run;
但是由于不允许对变量进行分组,所以我不断收到错误代码。
我尝试对数组执行相同的操作,但仍无法找到解决方案:
Data want;
Set have;
Array a (*) a_var:;
Array other (2,4) b_var: c_var:;
do i = 1 to dim(a);
If a(i) = 1 then type=1;
end;
do i = 1 to 4;
If other (1,i) = 1 then type=2;
If other (2,i) = 1 then type=3;
Else type=0;
end;
drop i;
Run;
我试图根据条件的满足来创建3类“类型”变量(0、1、2和3)。
答案 0 :(得分:1)
谢谢!
这是最终有效的代码。
DATA have;
INPUT id
a_var_a a_var_b a_var_c a_var_d a_var_e
b_var_a b_var_b b_var_c b_var_d
c_var_a c_var_b c_var_c c_var_d;
if whichn (1, of a_var: ) =>1 then type=1;
else if whichn (1, of b_var: ) =>1 then type=2;
else if whichn(1, of c_var:) =>1 then type=3;
else type = 0;
DATALINES;
01 1 0 0 0 0 0 0 0 0 0 0 0 0
02 0 1 0 0 0 0 0 0 0 0 0 0 0
03 0 0 1 0 0 0 0 0 0 0 0 0 0
04 0 0 0 1 0 0 0 0 0 0 0 0 0
05 0 0 0 0 1 0 0 0 0 0 0 0 0
06 0 0 0 0 0 1 0 0 0 0 0 0 0
07 0 0 0 0 0 0 1 0 0 0 0 0 0
08 0 0 0 0 0 0 0 1 0 0 0 0 0
09 0 0 0 0 0 0 0 0 1 0 0 0 0
10 0 0 0 0 0 0 0 0 0 1 0 0 0
11 0 0 0 0 0 0 0 0 0 0 1 0 0
12 0 0 0 0 0 0 0 0 0 0 0 1 0
13 0 0 0 0 0 0 0 0 0 0 0 0 1
14 0 0 0 0 0 0 0 0 0 0 0 0 0
;
Run;
答案 1 :(得分:0)
我不认为prefix:
快捷方式可用于此类操作。
相反,我建议您使用宏基于DICTIONARY.COLUMNS生成所需的代码(有关示例,请参见data set column names into macro variable(s))。
您可以使用以下内容(未经测试)生成类似a_var_a=1 or a_var_b=1 or a_var_c=1 or a_var_d=1 or a_var_e=1
的条件:
/* preferably enclose this in a macro and declare the macrovariable as %local mvGroupAIsSet; */
proc sql noprint;
select cats(name, '=1') into :mvGroupAIsSet separated by ' or '
from dictionary.columns
where name like 'a_var_%' /* don't remember if you need to escape the underscores */
and libname = 'WORK'
and memname = 'HAVE';
quit;
然后在您的数据步骤中使用它:
data want;
set have;
if &mvGroupAIsSet then type = 1;
/* etc */
run;