gpt4 book ai didi

sas - 具有宏的分类变量

转载 作者:行者123 更新时间:2023-12-02 05:25:22 26 4
gpt4 key购买 nike

我正在尝试在 sas 中创建分类变量。我已经编写了以下宏,但在尝试运行时出现错误:“无效的符号变量名称 xxx”。我什至不确定这是实现我的目标的正确方法。

这是我的代码:

%macro addvars;
proc sql noprint;
select distinct coverageid
into :coverageid1 - :coverageid9999999
from save.test;

%do i=1 %to &sqlobs;
%let n=coverageid&i;
%let v=%superq(&n);
%let f=coverageid_&v;
%put &f;
data save.test;
set save.test;
%if coverageid eq %superq(&v)
%then &f=1;
%else &f=0;
run;
%end;
%mend addvars;
%addvars;

最佳答案

您以不正确的方式将宏代码与数据步骤代码组合在一起。 %if = macro language,这意味着您实际上是在评估文本“coverageid”是否等于 %superq(&v) 评估的文本,而不是 coverageid 变量的内容是否等于 &v 中的值。你可以将 %if 转换为 if,但即使你让它正常工作,它的效率也会非常低(你要重写数据集 N 次,所以如果你有 1500 个 coverageID 值,你会重写整个 500MB 数据集或诸如此类的 1500次,而不是一次)。

如果你想做的是获取变量“coverageid”并将其转换为一组变量,其中包含 coverageid 的所有可能值,1/0 二进制,对于每个变量,有多种方法可以做到这一点.我相当确定 ETS 模块有一个程序可以做到这一点,但我想不起来了——如果你把它发布到 SAS 邮件列表,那里的一个人无疑会很快。

对我来说,简单的方法是完全使用数据步骤代码来完成此操作。首先确定 COVERAGEID 有多少个潜在值,然后将每个值分配给一个直接值,然后将值分配给正确的变量。

如果 COVERAGEID 值是连续的(即 1 到某个数字,没有跳过,或者您不介意跳过)那么这很容易 - 设置一个数组并对其进行迭代。我假设它们不是连续的。

*First, get the distinct values of coverageID.  There are a dozen ways to do this, this works as well as any;
proc freq data=save.test;
tables coverageid/out=coverage_values(keep=coverageid);
run;

*Then save them into a format. This converts each value to a consecutive number (so the lowest value becomes 1, the next lowest 2, etc.) This is not only useful for this step, but it can be useful in the future in converting back.;

data coverage_values_fmt;
set coverage_values;
start=coverageid;
label=_n_;
fmtname='COVERAGEF';
type='i';
call symputx('CoverageCount',_n_);
run;
*Import the created format;
proc format cntlin=coverage_values_fmt;
quit;

*Now use the created format. If you had already-consecutive values, you could skip to this step and skip the input statement - just use the value itself;
data save.test_fin;
set save.test;
array coverageids coverageid1-coverageid&coveragecount.;
do _t = 1 to &coveragecount.;
if input(coverageid,COVERAGEF.) = _t then coverageids[_t]=1;
else coverageids[_t]=0;
end;
drop _t;
run;

关于sas - 具有宏的分类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13169694/

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