sas:一次重新编码一堆变量

时间:2016-12-20 16:16:30

标签: loops sas sas-macro

我们说我有10个变量,都有相同的前缀(它们以com开头)。

让我们说变量是二进制的,并且有一些丢失的数据,并且我想将所有丢失的数据设置为0.我想为每个变量生成一个新变量原始变量使原始数据完好无损。

我如何一次性重新编码所有这些变量?有一种简单的方法可以在SAS中运行循环吗?如果这是Python或R,我可以使用grep或类似的东西编写循环来完成所有操作。

编辑:以下是我尝试做的事情。我想使用带有com变量的无索引数组来创建名为new_com的副本(使用new为每个变量添加前缀)。然后我只想重新编码,我知道我可以使用if then语句进行重新编码。关于克隆变量的第一部分是我被困住的地方。

2 个答案:

答案 0 :(得分:1)

如果您不知道有多少变量但知道您想要的前缀,则编辑以下内容:

data test;
    input coma comet compton communism come comb community comerade complete comma;
    datalines;
    1   1   1   0   0   .   0   0   1   .
    ;
run;

%let prefix=com;

/* output the list of variables and only keep those with prefix */
proc contents data = test noprint out=names(keep=name varnum); run;

proc sort data = names;
    by varnum;
run;

/* create your new variable with a "new_" prefix */
data names1; set names;
    if index(name,"&prefix.");
    new_name = "new_"||strip(name);
run;

/* put lists into macro variables */
proc sql noprint;
    select name
    into: old_vars separated by " "
    from names1;

    select new_name
    into: new_vars separated by " "
    from names1;

    select count(*)
    into: nobs
    from names1;
quit;

%put &old_vars.;
%put &new_vars.;
%put &nobs.;

/* use array and macro variables to manipulate data */
data test1; set test;
    array old(&nobs.) &old_vars.;
    array new(&nobs.) &new_vars.;
        do i=1 to &nobs.;
            if old(i) = . then new(i) = 0;
                else new(i) = old(i);
        end;
    drop i;
run;

答案 1 :(得分:1)

假设您已获得SAS / STAT许可,则最简单的方法是使用Aborting response due to origin not allowed

PROC STDIZE

data have; array com[10]; call streaminit(7); do _j = 1 to 10; do _i = 1 to 10; if rand('Uniform') < 0.2 the com[_i]=.; else com[_i]=1; end; output; end; run; proc stdize data=have out=have_zero missing=0 reponly sprefix=new_ oprefix=old_; var com:; run; 表示不进行任何标准化(仅针对缺失归零),reponlysprefix指定标准化和原始变量的前缀。