“在SAS中创建子集”;自动地;

“在SAS中创建子集”;自动地;,sas,dataset,subset,Sas,Dataset,Subset,我已经通过sas生成了一个包含144行的数据集,现在我想创建数据集的18个子集(每个子集包含8行)。我知道如何使用firstobs=和obs=命令手动创建子集。但是,我希望自动创建子集“。这样做的原因是,我正在从特定网站提取数据,每次运行代码时,数据集的大小都不同,我所知道的是,每次生成数据集时,我都希望创建包含8行的X子集(例如,第一个子集将由行1-8组成,第二个子集将由行9-16组成,依此类推……) 那么我的问题是,我如何着手解决这个问题呢?宏观方法: 我只是提供了一个粗略的代码。根据您的需

我已经通过sas生成了一个包含144行的数据集,现在我想创建数据集的18个子集(每个子集包含8行)。我知道如何使用
firstobs=
obs=
命令手动创建子集。但是,我希望自动创建子集“。这样做的原因是,我正在从特定网站提取数据,每次运行代码时,数据集的大小都不同,我所知道的是,每次生成数据集时,我都希望创建包含8行的X子集(例如,第一个子集将由行1-8组成,第二个子集将由行9-16组成,依此类推……)

那么我的问题是,我如何着手解决这个问题呢?

宏观方法:

我只是提供了一个粗略的代码。根据您的需求进行优化

proc sql;
    select count(*) into :total from source_data;
quit;

%macro create_subsets(count,ds);

    %let cnt=%sysfunc(ceil(%sysevalf(&count/8)));

    %let num=1;


    %do i=1 %to &cnt;

        %if(&i = &cnt) %then %do;
            %let toread=&count;
        %end;
        %else %do;
            %let toread=&num+7;
        %end;

        data &ds._&i;
            set &ds(firstobs=&num obs=%eval(&toread));
        run;

        %let num=%eval(&num + 8);
    %end;

%mend create_subsets;

%create_subsets(&total,source_data)
根据罗伯特的宝贵评论编辑。
注意:非宏方法总是更容易、更有效。

我不知道子集的用途是什么,但通常将数据集拆分为多个版本是个坏主意。更好的方法是在原始数据集中创建一个包含子集编号的变量,这样以后就可以很容易地提取特定子集或按其分组

这里有一个简单的方法,很明显,如果记录数不能被8整除,那么最后的子集将不会有8行。根据你的问题,我假设不管记录大小,8行都是固定数量

data want;
set sashelp.citimon;
subset = ceil(_n_/8);
run;

你已经试过什么代码了?请参阅,和。虽然宏方法可行,但非宏解决方案几乎总是优于宏解决方案(更易于阅读/维护/更少的bug,等等)。此外,此方法将读取源数据集8次。这意味着速度会慢8倍。最后,你还应该考虑参数< <代码> 8 >代码>值,以便调用宏的人可以选择他们想要多少个子集。谢谢KAY!宏已工作并正在成功创建所需的子集。我还有一个问题,我现在想转置X子集,并基于一些变量合并它们。。同样,我知道如何将数据集转置和合并在一起,但如何将转置和合并函数添加到宏中,使其适用于任意数量的子集?希望这有意义。我在sas中使用宏的能力非常有限。。。。我是这方面的新手。我知道了如何使用宏对数据集进行转置:)嗨,我知道了要添加到您提供给我的宏中的转置和合并语句。谢谢你的帮助谢谢Kieth的回复。感谢您的指导!