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 sql
和 select 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);
通过查看之前的作业准备考试,这个对我来说很棘手:
`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 sql
和select 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);