全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1206 4
2012-09-09
悬赏 5 个论坛币 已解决
proc format;
value group low-1='l小于1'
            1.1-2='1-2'
                        2.1-3='2-3'
                        3.1-4='3-4'
                        4.1-5='4-5'
                        5.1-6='5-6'
                        6.1-7='6-7'
                        7.1-8='7-8'
                        8.1-9='8-9'
                        9.1-10='9-10'
                        10.1-11='10-11'
                        11.1-12='11-12'
                        12.1-13='12-13'
                        13.1-14='13-14'
                        14.1-high="大于14"
                        ;
                        run;

如上例,就是format对变量的一个分组程序,是为了以后用。
上例中,第一组上限是1,最后一组下限是14,组间隔为1,现在我想做一个宏程序,定义三个参数,下限为low 上限为high,间隔为interval
如当low=2, high=16, interval=2时,就是  low-2="小于2"  2.1-4='2-4'   4.1-6='4-6'  ........  16.1-high="大于16"
求高手,这个宏怎么写

最佳答案

nomad5 查看完整内容

%macro l_format(name=,low=,high=,interval=); data l_a; do i=&low. to %sysevalf(&high.-&interval.) by &interval.; var1=catx('',i+0.1,'-',i+&interval.) ; var2=catx('',i,'-',i+&interval.); output; end; run; data _null_; set l_a end=final; call symput('name'||strip(_n_),catx('',var1,'=','"',var2,'"')); ...
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2012-9-9 22:16:42
%macro l_format(name=,low=,high=,interval=);

    data l_a;
        do i=&low. to %sysevalf(&high.-&interval.) by &interval.;
            var1=catx('',i+0.1,'-',i+&interval.) ;
            var2=catx('',i,'-',i+&interval.);
            output;
        end;
    run;

    data _null_;
        set l_a end=final;
        call symput('name'||strip(_n_),catx('',var1,'=','"',var2,'"'));
        if final then call symput('num',strip(_n_));
    run;

    proc format;
        value &name.
        low - &low. = "小于&low."
            %do i=1 %to &num.;
                &&name&i..
            %end;
        %sysevalf(&high.+0.1) - high = "大于&high.";
    run;

    proc delete data=l_a; run;
%mend;
%l_format(name=group,low=3,high=16,interval=0.5);

data a;
    input a;
    cards;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    16.1
    ;
run;

data b;
    set a;
    b=put(a,group.);
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-9-10 00:48:21


%macro test(low,high,interval);

%let var1=low-&low.="小于&low."; %put &var1.;/*头的形式*/

/*中间循环变化形式*/
%do i=&low. %to %eval(&high.-&interval.) %by &interval.;

        %let var2=%sysevalf(&i.+0.1)-%sysevalf(&i.+&interval.)="&i.-%sysevalf(&i+&interval.)";%put &var2.;
        %let var1=&var1. &var2.;%put &var1.;

%end;

%let var2=%sysevalf(&high.+0.1)-high="大于&high.";/*尾的形式*/

&var1. &var2.;

%mend;

/*定义format*/
proc format;
value group %test(2,16,2);
run;;

/*测试*/
data test;
x=2.2;output;
x=7;output;
x=11.1;output;
x=8.6;output;
x=16;output;
x=17;output;
format x group.;
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-9-10 12:46:46
%macro l_format(name=,low=,high=,interval=);
    proc format;
        value &name.
        low - &low. = "小于&low."

        %do i=&low. %to %eval(&high.-&interval.) %by &interval.;
            %let j=%eval(&i. + &interval.);

            &i..1 - &j. = "&i.-&j."

        %end;

        &high..1 - high = "大于&high."
    ;
    run;
%mend;
%l_format(name=group,low=3,high=18,interval=3);

data a;
    input a 8.;
    cards;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    16.1
    ;
run;

data b;
    set a;
    b=put(a,group.);
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-9-11 09:59:04
nomad5 发表于 2012-9-10 12:46
%macro l_format(name=,low=,high=,interval=);
    proc format;
        value &name.
高手,这个宏的interval如果不是整数就不行,请问怎么改一下,可以使interval为小数,如0.5
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群