楼主: andy162639
6769 35

SAS变量批量删除 [推广有奖]

21
andy162639 发表于 2011-11-9 10:42:07
HaricH 发表于 2011-11-9 10:23
因为变量太多超过宏变量长度的问题,修改了一下:
proc content里面导出来的表里面已经有变量在数据集中的 ...
宏参数Step表示什么含义呢?还有 我想删除任意观测的变量,如 第一个观测删2-100个变量,第二个观测删除6-100个变量。您的宏好像修改cutnum直接默认 比如cutnum=2 则 第一个删2-100 第二个删3-100.谢谢
有人说,统计归根结底就是个P

22
HaricH 发表于 2011-11-9 10:49:54
由于一次把过多宏变量名加入一个宏变量列表会引起宏变量值超过65,534长度,所以用step设置步长,一次将step个变量写入一个宏变量列表。一个变量名最长32字符,65534/33(含分割符为33位)约为1985,所以step设置为1985就可以了。

23
HaricH 发表于 2011-11-9 10:54:25
用_n_记录观测序号, &Var_order表示变量序号。
第一个观测删除2-100则在DATA步的循环里面加入
if _n_=1 and &var_order<=100 and &var_order>=2 then
       /*your operate*/

24
andy162639 发表于 2011-11-9 11:14:45
HaricH 发表于 2011-11-9 10:54
用_n_记录观测序号, &Var_order表示变量序号。
第一个观测删除2-100则在DATA步的循环里面加入
if _n_=1  ...
data a;
set a;
if _n_>1  then do;*是修改这里吗?貌似不行啊
太麻烦你了,多谢哈
比如第二个观测删3-200,第三个删5-100如何修改呢?

有人说,统计归根结底就是个P

25
HaricH 发表于 2011-11-9 11:20:54
将if _n_>1  then do;和end;删掉 ,在

data a;
set a;
        %do c=1 %to &num.-1;
                %let i=1;
                %do %while(%scan(&&name_list&c,&i,-) ne %quote());
                        %let var=%scan(&&name_list&c,&i,-);
                        %let Var_order=%eval(&cutnum.+&i.-1);/*Var_order为变量在数据集中的序号*/
   /*操作。。。,如if _n_=1 and &var_order<=100 and &var_order>=2 then 。。。end;*/
                        %let i=%eval(&i+1);
                %end;
                %let cutnum=%eval(&Var_order+1);
        %end;
run;
已有 1 人评分学术水平 热心指数 收起 理由
andy162639 + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

26
soporaeternus 发表于 2011-11-9 13:05:19
根据不同行删除不同变量?
删是指给缺失值,还是指把后面的变量提上来?
Let them be hard, but never unjust

27
andy162639 发表于 2011-11-9 14:36:14
soporaeternus 发表于 2011-11-9 13:05
根据不同行删除不同变量?
删是指给缺失值,还是指把后面的变量提上来?
给缺失值
有人说,统计归根结底就是个P

28
andy162639 发表于 2011-11-9 14:40:03
HaricH 发表于 2011-11-9 10:54
用_n_记录观测序号, &Var_order表示变量序号。
第一个观测删除2-100则在DATA步的循环里面加入
if _n_=1  ...
宏变量cutnum的含义是?谢谢
有人说,统计归根结底就是个P

29
HaricH 发表于 2011-11-9 15:39:05
cutnum是从第几个变量开始处理,因为之前你的需求里面说到是从某位变量开始,如第100个变量之后的都置空。所以设置了这个宏变量。

30
crazygoing 发表于 2011-11-9 16:29:56
andy162639 发表于 2011-11-9 00:30
原数据集的变量名变成COL1 COL2...了,是否有办法保留原变量名?
可以的。我的思路就是把原数据集清空,把新的数据集加进去就可以了。完整代码如下
  1. data a;
  2. input a1  a2 a3 a4 a5;
  3. cards;
  4. 3  2 3 4 5
  5. 4 3 4 5 6
  6. ;
  7. run;
  8. proc iml;
  9. use a;
  10. read all into x        ;
  11. x[,3:5]=.; *如果是200-9000列,就写x[,200-9000];
  12. create b from x;
  13. append from x;
  14. quit;

  15. data c;set a;
  16. if _N_>0 then delete;
  17. run;
  18. proc sql noprint;
  19. create table c as
  20. select * from c
  21. union
  22. select * from b;
  23. quit;
复制代码

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-31 16:10