【问题标题】:Create and use a list in an IF statement in SAS在 SAS 的 IF 语句中创建和使用列表
【发布时间】:2014-02-04 02:53:11
【问题描述】:

用户 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 Telephone in(List) then Invalid=1”

这是从预先确定的无效号码列表中验证电话号码列表所必需的。

【问题讨论】:

    标签: arrays list macros sas


    【解决方案1】:

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

    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;
    

    这可以比列表方法更快,并且不存在长度问题。

    【讨论】:

    • 非常感谢,使用第一种方法效果很好,因为只有几百个数字。
    【解决方案2】:

    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;
    

    【讨论】:

    • 也试过了,效果很好,我只会把 Joe 的答案作为我接受的答案,因为它创建了一个宏变量,事实证明它对验证多个数据集很有用。非常感谢您的回复!
    • 我试过这个。随着invalid_phones 的值越来越多,它很快就会变得低效。如果无效数字很少,那就太好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 2020-03-03
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多