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