全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
3493 6
2012-11-28
是这样的,想要根据数据A的观测值数来生成新的数据集:
如果数据A的观测数小于等于20,那么就生成数据B,B=A;
如果数据A的观测数大于20,那么就生成数据C,C是从A中随机抽出20个数据。

请问如何实现?小弟跪谢了!
二维码

扫码加我 拉你入群

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

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

全部回复
2012-11-28 15:50:40
%macro table;
%let disd=%sysfunc(open(A));
%let nobs=%sysfunc(attrn(&disd,nobs));
%if  &nobs<=20 %then %do;
data B;
set A;
run;
%end;
%else  %do;
proc  sql outobs=20;
create table c as
select * from a order by ranuni(0);
quit;
%end;
%mend;

%table
二维码

扫码加我 拉你入群

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

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

2012-11-28 16:01:29

%let ds=sashelp.company;
%let sampsize=20;

data _null_;
    length code $1000;
    *** decide the number of observations;
    if 0 then set &Ds nobs=obsnum;
   
        *** when less than or equal to 20;
        if obsnum<=20 then do
       code ="data c; set &ds; run;";
           call execute(code);
           stop;
        end;

        *** when more than 20;
        else do ;
     code="data d(drop=sampsize obsleft);
                      sampsize=&sampsize;
                        obsleft=totobs;
                        do while(sampsize>0);
                                pickit+1;"
           ||         "if ranuni(0)<sampsize/obsleft then do;
                                        set &ds point=pickit nobs=totobs;
                                        output;
                                        sampsize=sampsize-1;
                                end;
                                obsleft=obsleft-1;
                        end;
                        stop;
                run;";
           call execute(code);
           stop;
        end;
run;
二维码

扫码加我 拉你入群

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

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

2012-11-28 16:17:07
%macro test(dsn);
        proc sql noprint;
                select count(*) into: obsnum
                        from &dsn;
        quit;
        %if &obsnum le 20 %then %do;
                data test1;
                        set &dsn;
        run;
        %end;
        %else %do;
        proc surveyselect data=&dsn
                                        method=srs
                                        n=20
                                        out=test2;
        run;
        %end;
%mend test(dsn);
%test(rawdsn)

二维码

扫码加我 拉你入群

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

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

2012-11-28 16:41:45
ziyenano 发表于 2012-11-28 15:50
%macro table;
%let disd=%sysfunc(open(A));
%let nobs=%sysfunc(attrn(&disd,nobs));
谢谢这位神!
我运行后为什么显示 “指定的查询涉及按其 SELECT 子句中没出现的一项排序。”呢?
是不是ranuni(0)的原因?
其他都可以,大神再看看,这种情况正常不?
二维码

扫码加我 拉你入群

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

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

2012-11-28 17:13:19
daazx 发表于 2012-11-28 16:41
谢谢这位神!
我运行后为什么显示 “指定的查询涉及按其 SELECT 子句中没出现的一项排序。”呢?
是不是 ...
没什么影响,只不过随机数ranuni(0)没有在select中出现;
不放心可以改成这样
proc  sql outobs=20;
create table c as
select a.*,ranuni(0) as random from a  order by random;
quit;
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

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