SAS:如果值为99,98或0,则替换所有变量中的值

时间:2015-02-25 20:06:04

标签: sas

通过查看之前的作业准备考试,这个对我来说很棘手:

`enter code here`data xxx.data001(drop=i);
    set xxx.data001;
        array nvr {*} _NUMERIC_;
            do i = 1 to dim(nvr);
                if nvr{i} in (99 98 0) then nvr{i} = .;
            end;
run;

我被要求在不使用数组的情况下制作类似的程序。

到目前为止,我已尝试过替换功能:

replace _ALL_ where(_ALL_ = 99 | 98 | 0)

非常感谢任何帮助。!

谢谢

编辑:

感谢大家的回复 - 精彩的社区!! :-) 关于课程,我很确定我可以做任何事情......我们的学习或多或少都有自主权。

有人可以解释一下这行中会发生什么:

if nvr{i} in (99 98 0) then nvr{i} = .;

特别是" in"令我困惑。是99,98和0变量或观测值?

谢谢

1 个答案:

答案 0 :(得分:0)

Frans:正如Joe在下面指出的那样,如果您在课程中已经涵盖了这些材料,那么这对您有用。

这是一种宏观方法。该解决方案的主要组成部分是:

  • 允许使用%do循环
  • 的宏包装器
  • proc contents返回包含数据中变量详情的数据集
  • proc sql select into :存储来自宏变量中数据集的数据(可以找到冒号的一些额外用法{/ 3}})
  • separated by " "创建一个空格分隔列表
  • 迭代每个列的%do循环
  • %sysfunc()宏函数允许调用数据步骤函数作为宏语句的一部分
  • %scan()宏函数,用于一次从列表中提取单个变量名称

/* Wrap the code in a macr so we can use %do loop */
%macro remove9899(data);
    /* Get all the columns information */
    proc contents data = &data. out = cols noprint;
    run;
    /* Store the numeric columns as a space seperated list in a macro variable */
    proc sql noprint;
        select name 
        into :cols separated by " "
        from cols
        where type = 1;
    quit;
    data &data.;
        set &data.;
        /* Loop through each numeric variable and make the conditional replacement */
        %do i = 1 %to %sysfunc(countw(&cols., %str( )));
            %let col = %scan(&cols., &i., %str( ));
            if &col. in (0, 98, 99) then &col = .;
        %end;
    run;
%mend remove9899;

%remove9899(xxx.data001);