SAS中文论坛

标题: 关于删除变量的问题! [打印本页]

作者: shiyiming    时间: 2004-4-8 14:38
标题: 关于删除变量的问题!
假设在数据集 a 里有90个以字母cov开头变量名,如:cov1,cov2,…,cov90,对应数组 cov(9,10), 现在想删除其中满足一定条件的一部分变量。
%macro ddel;
%do i=1 %to 10;
%do j=1 %to 10;
data t1;
set bf.t1;
if &i.>=&j. then do;
drop cov10*(&i.-1)+&j.; /*这一步有问题,我的本意是当i=1,j=1时,删掉cov1,*/
end;
run;
%end;
%end;
%mend;

请问如何解决?
作者: shiyiming    时间: 2004-4-8 18:56
drop cov%eval(10*(&i.-1)+&j.);
作者: shiyiming    时间: 2004-4-9 10:35
标题: Re: 关于删除变量的问题!
[quote="hero":6f777]假设在数据集 a 里有90个以字母cov开头变量名,如:cov1,cov2,…,cov90,对应数组 cov(9,10), 现在想删除其中满足一定条件的一部分变量。
%macro ddel;
%do i=1 %to 10;
%do j=1 %to 10;
data t1;
set bf.t1;
if &i.>=&j. then do;
drop cov10*(&i.-1)+&j.; /*这一步有问题,我的本意是当i=1,j=1时,删掉cov1,*/
end;
run;
%end;
%end;
%mend;

请问如何解决?[/quote:6f777]

将data t1;set bf.t1;放在宏内是效率极其不高的,因为每运行一个循环就要打开、扫描和读入一次数据。这样,为了删掉50个变量就需要读100次数据!

不如这样修改,在宏内用循环产生一列字符(如 cov1 cov 11 ...)来代表这些需删掉的变量。然后在data 步直接调用这些字符即可。

%macro dde1;
%do i=1 %to 9;
        %do j=1 %to 10;
                        %if &i.>=&j. %then
                        cov%eval(10*(&i.-1)+&j.);
        %end;
%end;
%mend dde1;

宏ddel将产生字符cov1 cov11...。

例如:
data _test;
        array covx(90) cov1-cov90;
run;

/*只要读一次数据*/
data test;
        set _test;
        drop %dde1; /*相当于 drop cov1 cov11 ...*/
run;
作者: shiyiming    时间: 2004-4-9 11:25
标题: 非常感谢!
版主你太牛了!小生佩服!

我按照你的思路运行了一下,问题解决了!

非常感谢! 虚心向您学习!




欢迎光临 SAS中文论坛 (http://www.mysas.net/forum/) Powered by Discuz! X3.2