作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
用户 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/
我是一名优秀的程序员,十分优秀!