SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 702|回复: 3
打印 上一主题 下一主题

关于删除变量的问题!

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2004-4-8 14:38:55 | 只看该作者

关于删除变量的问题!

假设在数据集 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;

请问如何解决?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2004-4-8 18:56:08 | 只看该作者
drop cov%eval(10*(&i.-1)+&j.);
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 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;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2004-4-9 11:25:37 | 只看该作者

非常感谢!

版主你太牛了!小生佩服!

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

非常感谢! 虚心向您学习!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-1-9 23:35 , Processed in 0.110555 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表