gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:40:46 26 4
gpt4 key购买 nike

用户 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”

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

最佳答案

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

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;

这比列表方法更快,而且没有长度问题。

关于arrays - 在 SAS 的 IF 语句中创建和使用列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21140781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com