SAS中文论坛

标题: 关于如何快速筛选字段 [打印本页]

作者: shiyiming    时间: 2011-1-30 11:40
标题: 关于如何快速筛选字段
[color=#4000BF:3l7lhfg9][size=150:3l7lhfg9]请教一个问题,我现在有一个表,第一列是ID,字符型变量,剩余的所有其他列也都是字符型变量,

我现在需要将除了第一列的都变成数字型,请问如何用快速的写出语句,不要一个一个写,谢谢!

[/size:3l7lhfg9][/color:3l7lhfg9]
作者: shiyiming    时间: 2011-1-30 14:21
标题: Re: 关于如何快速筛选字段
[code:8j7ejj37]data raw;
    input id $ var1 $ var2 $;
datalines;
a1 11 12
a2 21 22
;
options nomprint nosymbolgen nomlogic mcompilenote=all;
%macro Benhope(dsname=, firstvar=2, prefix=n_);
    %local err libname nvarname;
    %let err=0;
    %let dsname=%upcase(&dsname);
    %let prefix=%upcase(&prefix);
    %if %sysfunc(exist(&dsname)) ne 1 %then %do;
        %let err=1;
        %put WARNING: *** Dataset(&dsname) Not Exist! ***;
    %end;
    %if &err eq 0 %then %do;
        %if %index(&dsname, .) %then %do;
            %let libname=%scan(&dsname, 1, .);
            %let dsname=%scan(&dsname, 2, .);
        %end;
        %else %let libname=WORK;
        %if %length(&dsname) gt 30 %then %let out_dsname=N_%substr(&dsname, 1, 30);
        %else %let out_dsname=N_&dsname;
        proc sql;
            create table _temp as
                select name as varname, type, varnum
                    from sashelp.vcolumn
                    where libname="&libname" and memname="&dsname"
                          and memtype='DATA' and type='char'
                    order by varnum;
        quit;
        %let dsid=%sysfunc(open(work._temp));
        %let num=%sysfunc(attrn(&dsid, nlobs));
        %if &num gt 0 %then %do;
            %syscall set(dsid);
            data &out_dsname;
            set &dsname;
            %do i=&firstvar %to #
                %let rc=%sysfunc(fetchobs(&dsid, &i));
                %if %length(&varname) gt 30 %then %let nvarname=N_%substr(&varname, 1, 30);
                %else %let nvarname=N_&varname;
                %put NOTE: *** Character Variable (%trim(&varname)) Converted Numeric Variable! ***;
                &nvarname=input(&varname, best.);
                drop &varname;
                rename &nvarname=&varname;
            %end;
            run;
        %end;
        %if &dsid gt 0 %then %let rc=%sysfunc(close(&dsid));
        proc datasets library=work nolist;
            delete _temp;
        quit;
    %end;
%mend;
%benhope(dsname=raw)[/code:8j7ejj37]
作者: shiyiming    时间: 2011-1-30 14:44
标题: Re: 关于如何快速筛选字段
[code:xkljmecd]data raw;
    input id $ var1 $ var2 $;
datalines;
a1 11 12
a2 21 22
;

proc sql;
    select  compbl(' input(' ||name||',best8.) as '||name) into :inputstr separated by ','
    from sashelp.vcolumn
    where libname='WORK' and memname='RAW' and name~='ID';
    create table final as
    select id ,&inputstr
    from raw
    ;[/code:xkljmecd]
作者: shiyiming    时间: 2011-1-30 15:59
标题: Re: 关于如何快速筛选字段
[size=150:12wnwuzf][color=#4000BF:12wnwuzf]两位大侠,你们的代码好深奥啊,我在想可否根据变量名建立循环,但是我的变量名是没有规律的

[/color:12wnwuzf][/size:12wnwuzf]
作者: shiyiming    时间: 2011-1-30 16:08
标题: Re: 关于如何快速筛选字段
你哪只眼睛看出我们的代码要求变量名有规律了?左眼看出挖左眼,右眼看出挖右眼。。。。。
作者: shiyiming    时间: 2011-1-30 17:16
标题: Re: 关于如何快速筛选字段
to ahuige
[color=#4000BF:19e81ndr][size=150:19e81ndr]误会我的意思了。。。我请教一下我上面构想的那种思路可以实现吗?

处理这样一个不大的问题,用到两位这样的代码,缺失有点杀鸡用了牛刀了

[/size:19e81ndr][/color:19e81ndr]
作者: shiyiming    时间: 2011-1-30 17:17
标题: Re: 关于如何快速筛选字段
to ahuige
<!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->  great
作者: shiyiming    时间: 2011-1-30 19:37
标题: Re: 关于如何快速筛选字段
to muir
SAS的特点就是这样,不大的问题也要用复杂的代码来完成,但是有些复杂的问题,它却有现成的代码,哈哈.
作者: shiyiming    时间: 2011-1-31 09:52
标题: Re: 关于如何快速筛选字段
奉送简单代码。恭喜新年发财。。。
[code:ghvtrd0o]data new;
        set old;
        newid=_n_;
        drop oldid;
run;[/code:ghvtrd0o]




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2