Loops sas:一次重新编码一组变量

Loops sas:一次重新编码一组变量,loops,sas,sas-macro,Loops,Sas,Sas Macro,假设我有10个变量,都有相同的前缀(它们以com开头) 假设变量是二进制的,有一些缺少的数据,我想把所有缺少的数据都设置为0。我想为每个原始变量生成一个新变量,这样原始数据就完好无损了 我将如何一次重新编码所有这些变量?有没有一种简单的方法可以在SAS中运行循环?如果这是Python或R,我可以使用grep或类似的东西编写一个循环来完成这一切 编辑:以下是我要做的。我想使用带有com变量的未索引数组来创建名为new\u com(在每个变量前面加new)的副本。然后我只想重新编码,我知道我可以使用

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

假设变量是二进制的,有一些缺少的数据,我想把所有缺少的数据都设置为0。我想为每个原始变量生成一个新变量,这样原始数据就完好无损了

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


编辑:以下是我要做的。我想使用带有
com
变量的未索引数组来创建名为
new\u com
(在每个变量前面加
new
)的副本。然后我只想重新编码,我知道我可以使用
if
Then
语句来完成。第一部分,关于克隆变量,是我遇到的问题。

如果您不知道有多少变量,但知道所需的前缀,则编辑下面的内容:

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;

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

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;

假设您拥有SAS/STAT许可证,那么使用
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;
数据已经存在;
数组com[10];
调用streaminit(7);
do_j=1到10;
do_i=1至10;
如果兰德(‘统一’)小于0.2,则com[_i]=。;
else com[_i]=1;
结束;
产出;
结束;
跑
proc stdize data=have out=have\u zero missing=0 reponly sprefix=new\uoprefix=old\ux;
var-com:;
跑

reponly
表示不进行任何标准化(仅为缺失的变量输入零),
sprefix
oprefix
指定标准化变量和原始变量的前缀。

假设您已获得SAS/STAT许可,使用
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;
数据已经存在;
数组com[10];
调用streaminit(7);
do_j=1到10;
do_i=1至10;
如果兰德(‘统一’)小于0.2,则com[_i]=。;
else com[_i]=1;
结束;
产出;
结束;
跑
proc stdize data=have out=have\u zero missing=0 reponly sprefix=new\uoprefix=old\ux;
var-com:;
跑

reponly
表示不进行任何标准化(仅为缺失输入零),
sprefix
oprefix
指定标准化变量和原始变量的前缀。

您可以使用if语句定义每个新变量,例如if com1=。那么com1_nm=0;否则com1_nm=com1;或者,由于这将是相当重复的,您可以使用do循环和数组来节省编写大量代码的时间。谢谢,这很有帮助,但是有两个问题:我需要使用前缀重命名变量,我不需要在数组中单独列出每个变量,而是使用一些通配符。您可以使用if语句定义每个新变量,例如if com1=。那么com1_nm=0;否则com1_nm=com1;或者,由于这将是相当重复的,您可以使用do循环和数组来节省编写大量代码的时间。谢谢,这很有帮助,但是有两个问题:我需要使用前缀重命名变量,我不需要在数组中单独列出每个变量,而是使用一些通配符。有关于如何做到这一点的见解吗?如果我没有呢?有没有办法告诉SAS查找
old
的长度?我编辑了上面的代码以反映这一点。你只需要知道你的前缀,你应该被设置好。如果我不知道呢?有没有办法告诉SAS查找
old
的长度?我编辑了上面的代码以反映这一点。你需要知道的是你的前缀,你应该被设置。如果你想让原始变量保持它们的名称,请使用不带前缀的OPREFIX选项。编辑:嗯,我第一次这么做时它不起作用,但现在它起作用了……如果你想让原始变量保持它们的名称,请使用不带前缀的OPREFIX选项。编辑:嗯,我第一次做的时候它不起作用,但现在它起作用了。。。