通过查看之前的作业准备考试,这个对我来说很棘手:
`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变量或观测值?
谢谢
答案 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);