| 
 | 
板凳
 
 
 楼主 |
发表于 2004-4-9 10:35:20
|
只看该作者
 
 
 
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; |   
 
 
 
 |