【问题标题】:sas: recode a bunch of variables at oncesas:一次重新编码一堆变量
【发布时间】:2016-12-20 16:16:30
【问题描述】:

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

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

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

编辑:这就是我想要做的。我想使用带有com 变量的未索引数组来创建它们的副本,称为new_com(为每个变量添加前缀new)。然后我只想重新编码,我知道我可以使用 if then 语句来完成。第一部分,关于克隆变量,是我卡住的地方。

【问题讨论】:

  • 您可以使用 if 语句定义每个新变量,例如 if com1 = 。那么 com1_nm =0;否则 com1_nm = com1;或者因为这将是相当重复的,您可以使用 do 循环和数组来节省您编写这么多代码的时间。 support.sas.com/resources/papers/proceedings10/158-2010.pdf
  • 谢谢,这很有帮助,但有两个问题:我需要使用前缀重命名变量,而且我不想在数组中单独列出每个变量,而是使用一些通配符。关于如何做到这一点的任何见解?

标签: loops sas sas-macro


【解决方案1】:

假设您已获得 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;

reponly 表示不进行任何标准化(仅将缺失归为零),sprefixoprefix 指定为标准化和原始变量添加前缀的内容。

【讨论】:

  • 如果您希望原始变量保留其名称,请使用不带前缀选项的 OPREFIX。
  • 编辑:嗯,它在我第一次时不起作用,但现在它起作用了......
【解决方案2】:

如果你不知道你有多少个变量但知道你想要的前缀,下面是编辑的:

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 找到old 的长度?
  • 我编辑了上面的代码以反映这一点。您只需要知道您的前缀,就应该设置好。
猜你喜欢
  • 1970-01-01
  • 2019-10-31
  • 2018-07-18
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多