楼主: andy162639
8984 22

[原创博文] sas变量批量删除 [推广有奖]

11
HaricH 发表于 2011-11-7 17:05:22

data a;
input x y z t w $;
cards;
1 2 3 4 s
3 4 2 1 s
3 4 2 1 s
3 4 2 1 s
3 4 2 1 s
;
run;

%macro cut(ds=,cutnum=);

proc contents data=&ds out=b(keep=name varnum);
run;

proc sql noprint;
        select name into:name_list separated by '-'
        from b
        where varnum>=&cutnum.
        order by varnum
;
quit;

%put &name_list.;

data a;
set a;
drop Var_order;
%let i=1;
%do %while(%scan(&name_list,&i,-) ne %quote());
        %let var=%scan(&name_list,&i,-);
        %let Var_order=%eval(&cutnum.+&i.-1);/*Var_order为变量在数据集中的序号*/
        if _n_>1  then do;
                if &Var_order>_n_-1 then
                        call missing(&var);
        end;
        %let i=%eval(&i+1);
%end;
run;

%mend;


%cut(ds=a , cutnum=2)

12
andy162639 发表于 2011-11-7 17:16:31
明白了谢谢
有人说,统计归根结底就是个P

13
andy162639 发表于 2011-11-7 20:57:55
yugao1986 发表于 2011-11-7 11:42
以你另一个帖子的例子,为例:
/*数据*/
data a;
谢谢你的解答,还有一个疑问,如果观测2是从第2个变量开始删,观测3是从第3个变量开始删,您的宏如何修改呢?谢谢!
data a;
input x y z t;
cards;
3 4 2 1
1 2 3 4
2 3 3 4
;
run;

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

14
yugao1986 发表于 2011-11-7 22:06:51
andy162639 发表于 2011-11-7 20:57
谢谢你的解答,还有一个疑问,如果观测2是从第2个变量开始删,观测3是从第3个变量开始删,您的宏如何修改 ...
矩阵里面直接定义元素下标
三人行必有我师

15
andy162639 发表于 2011-11-7 22:48:28
yugao1986 发表于 2011-11-7 22:06
矩阵里面直接定义元素下标
不是没有导入矩阵吗?
有人说,统计归根结底就是个P

16
andy162639 发表于 2011-11-7 22:52:48
变量太多, 无法手工输入,用iml 必需得输入变量名吧?
有人说,统计归根结底就是个P

17
andy162639 发表于 2011-11-8 16:56:36
HaricH 发表于 2011-11-7 17:05
data a;
input x y z t w $;
cards;
ERROR: The text expression length (70395) exceeds maximum length (65534). The text expression
       has been truncated to 65534 characters.
是因为变量名太多了吗? 如果是举例数据集,你的宏是可以的,但是我的变量有9000多个,怎么解决呢?谢谢
有人说,统计归根结底就是个P

18
andy162639 发表于 2011-11-8 16:57:20
yugao1986 发表于 2011-11-7 22:06
矩阵里面直接定义元素下标
您好!你的方法可以解决变量名手工输入的问题吗?
有人说,统计归根结底就是个P

19
HaricH 发表于 2011-11-8 17:14:44
可以设置个步长。

data a;
input x y z t w $;
cards;
1 2 3 4 s
3 4 2 1 s
3 4 2 1 s
3 4 2 1 s
3 4 2 1 s
;
run;

%macro cut(ds=,cutnum=,step=);

proc contents data=&ds out=b(keep=name varnum);
run;

data _null_;
set b(drop=_all_) nobs=n;
call symputx('total',n);
stop;
run;


%do %while(&cutnum.<=&total.);
        proc sql noprint;
                select name into:name_list separated by '-'
                from b
                where varnum>=&cutnum. and varnum<=&&cutnum.+&step-1
                order by varnum
        ;
        quit;

        %put &name_list.;

        data a;
        set a;
        %let i=1;
        %do %while(%scan(&name_list,&i,-) ne %quote());
                %let var=%scan(&name_list,&i,-);
                %let Var_order=%eval(&cutnum.+&i.-1);/*Var_order为变量在数据集中的序号*/
                if _n_>1  then do;
                        if &Var_order>_n_-1 then
                                call missing(&var);
                end;
                %let i=%eval(&i+1);
        %end;
        run;

        %let cutnum=%eval(&cutnum.+&step.);
%end;
%mend;


%cut(ds=a,cutnum=2,step=1)

20
meishanjia1900 发表于 2011-11-8 19:59:26
HaricH 发表于 2011-11-8 17:14
可以设置个步长。

data a;
我想会不会是因为楼主的变量太多,以至于name_list这个字符串的长度太长,超出了字符串长度的极限?

你并没有改动name_list,所以,我仍然抱有疑问。


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

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