在SAS中的IF语句中创建和使用列表

时间:2014-01-15 14:58:38

标签: arrays list macros sas

用户PomPazz发布此答案,用于根据输入变量创建列表:

“您需要使用宏来为您”编写“SAS代码。

这应该做你想要的。它采用以空格分隔的值列表,并根据代码指定的内容循环它们。如果您对此有疑问,请发表评论。

%macro doit(list);
proc sql noprint;
%let n=%sysfunc(countw(&list));
    %do i=1 %to &n;
        %let val = %scan(&list,&i);
        create table somlib._&val as
            select * from somlib.somtable
            where item=&val;
    %end;
quit;
%mend;

%doit(100 101 102);

注意,数据集不能以数字开头,所以我从'_'“

开始

我的问题是,如何应用于从数据集中的变量创建列表,该变量可以在IF语句中使用,例如“IF Phone in(List)in Invalid = 1”

这需要从预定的无效号码列表中验证电话号码列表。

2 个答案:

答案 0 :(得分:3)

您的问题的基本答案是您需要将其拉入宏变量或包含文件。

proc sql;
select distinct telephone into :tellist separated by ',' 
from invalid_phones;
quit;


data want;
set have;
if telephone in (&tellist.) then invalid=1;
run;

这仅限于大约32k个字符,所以如果你有超过3000个电话号码,它可能无效。如果电话是字符,则需要select distinct quote(telephone)

更详细的答案是,这通常效率低下。更好的是使用格式。

data for_fmt;
set invalid_phones;
start=telephone;
label='INVALID';
fmtname='TELCHECKF'; *add $ if telephone is a character field;
output;
if _n_=1 then do;  *this block adds a line to deal with non-matching records (hlo=o means other);
 start=.;
 label='VALID';
 hlo='o';
output;
end;
run;

proc format cntlin=for_fmt;
quit;

data want;
set have;
if put(telephone,TELCHECKF.)='INVALID' then invalidflag=1;
run;

这可能比list方法更快,并且没有长度问题。

答案 1 :(得分:3)

Joe的答案很棒,但我只是想补充一点,你可以在一个SQL步骤

中完成
proc sql noprint;

    create table want as
    select *, case
                when telephone in (select distinct telephone from invalid_phones) then 1
                else 0
            end as invalid
    from have
    ;
quit;