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

SAS: replace values in all variables if value is 99,98 or 0

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

`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 是变量还是观察值?

谢谢

Frans:正如 Joe 在下面指出的那样,只有在您的课程中涵盖了这个 material 时,这才对您有用。

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

  • 启用%do循环
  • 的宏包装器
  • proc contents 到 return 包含数据中变量详细信息的数据集
  • proc sqlselect into : 将数据集中的数据存储在宏变量中(可以找到冒号的一些额外用法 here
  • separated by " " 创建一个 space 分隔列表
  • 一个%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);