楼主: andy162639
6771 35

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

11
456852 发表于 2011-11-8 23:57:37
iml是种很好的办法,推荐。
通常,如果sql能拖出来的宏变量太长,超过最长长度,可以使用file XXX;put XXX;输出到外部文件然后用%include的方法引用进来。

12
andy162639 发表于 2011-11-9 00:29:03
crazygoing 发表于 2011-11-8 22:50
不知能否达到你的要求,仅供参考。
原数据集的变量名变成COL1 COL2...了,是否有办法保留原变量名?
有人说,统计归根结底就是个P

13
andy162639 发表于 2011-11-9 00:30:42
456852 发表于 2011-11-8 23:57
iml是种很好的办法,推荐。
通常,如果sql能拖出来的宏变量太长,超过最长长度,可以使用file XXX;put XXX ...
原数据集的变量名变成COL1 COL2...了,是否有办法保留原变量名?
有人说,统计归根结底就是个P

14
andy162639 发表于 2011-11-9 00:44:58
456852 发表于 2011-11-8 23:57
iml是种很好的办法,推荐。
通常,如果sql能拖出来的宏变量太长,超过最长长度,可以使用file XXX;put XXX ...
是否能提供代码呢,SQL用的很少。。。谢谢
有人说,统计归根结底就是个P

15
456852 发表于 2011-11-9 03:31:19
andy162639 发表于 2011-11-9 00:44
是否能提供代码呢,SQL用的很少。。。谢谢
我的意思是说,haricH的那个code里面,用了一段sql

proc sql noprint;
        select name into:name_list separated by '-'
        from b
        where varnum>=&cutnum.
        order by varnum
        
;
quit;
此段sql的功能,是生成宏变量name_list,包含所有需要改成missing的变量名,用'-'分隔。但是由于你的变量名太多,导致name_list这个宏变量突破了sas允许的宏变量的最大长度。所以报错了,解决方法之一是写到外部文件,比如:
data a;
input a b c d e f g h;
cards;
1 2 3 4 5 6 2 4
5 6 3 2 4 5 6 7
3 4 5 6 7 8 2 5
;
filename out 'c:\out.sas';
options source2;
proc contents data=a out=var noprint;run;
data var;
set var;
where varnum>=2;
if _n_=1 then name='array mis{*} '||trim(name);
run;
data _null_;
file out;
set var;
put name;
run;
data b;
set a;
%include out;
;
if _n_>=2 then do i=1 to dim(mis);
mis(i)=.;
end;
drop i;
run;
这段code从第二行开始,对第二个及其以后的变量赋缺失值,要求c盘根目录不能写保护。仅供参考。
已有 1 人评分学术水平 热心指数 收起 理由
andy162639 + 1 + 1 精彩帖子

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

16
andy162639 发表于 2011-11-9 09:42:51
456852 发表于 2011-11-9 03:31
我的意思是说,haricH的那个code里面,用了一段sql

proc sql noprint;
感谢您的回答,我运行了,有以下问题:
ERROR: All variables in array list must be the same type, i.e., all numeric or character.
是不是数组都要求变量类型统一?有解决办法吗?
有人说,统计归根结底就是个P

17
456852 发表于 2011-11-9 10:16:08
andy162639 发表于 2011-11-9 09:42
感谢您的回答,我运行了,有以下问题:
ERROR: All variables in array list must be the same type, i. ...
那也很简单阿,就是数字类作一遍,字符类作一遍咯。
contents出来的数据集里面有一列变量叫type(貌似),1为数字,2为字符(貌似)。
然后你先挑1的,弄个数组:nmis
nmis(i)=.
再挑2的,弄个数组:cmis
cmis(i)=''
就ok了呀。

18
HaricH 发表于 2011-11-9 10:23:46
因为变量太多超过宏变量长度的问题,修改了一下:
proc content里面导出来的表里面已经有变量在数据集中的排序了。
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;

options mprint;
%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;

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

        %let cutnum1=%eval(&cutnum1.+&step.);
                %put &&name_list&num;
                %let num=%eval(&num.+1);
%end;

data a;
set a;
if _n_>1  then do;
        %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 &Var_order>_n_-1 then
                                        call missing(&var);
                        %let i=%eval(&i+1);
                %end;
                %let cutnum=%eval(&Var_order+1);
        %end;
end;
run;


%mend;


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

19
HaricH 发表于 2011-11-9 10:24:30
还有一种就是将字典表抓进PDV的方法。

20
andy162639 发表于 2011-11-9 10:32:40
456852 发表于 2011-11-9 10:16
那也很简单阿,就是数字类作一遍,字符类作一遍咯。
contents出来的数据集里面有一列变量叫type(貌似) ...
怎么声明呢?可否把您的代码修改一下,告诉我,谢谢。
有人说,统计归根结底就是个P

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

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