如何通过 proc surveyselect 从数据集中循环单个观察?

How to loop a single observation from a dataset through proc surveyselect?

尝试不同的方法。我有一个包含 10000 个观察值的数据集,每个 ID 1000 个。我想通过 proc surveyselect 函数 运行 来自该数据集的每个 ID。我想通过函数将第一个 ID 运行 循环到第二个 ID 运行 通过函数。为每个 ID 输出一个数据集。我该如何执行?如果可以的话。

三种方式:

选项 1:调用执行

创建不同的 ID 列表,并在每个 ID 上 运行 call execute

proc sql noprint;
    create table all_ids as
        select distinct id
        from have
    ;
quit;

data _null_;
    set all_ids;

    call execute(cat('
        proc surveyselect data=have out=want_', id, ' sampsize=100;',
            ' where id = ', id, ';
        run;')
    );
run;

选项 2:使用宏循环

创建不同的 ID 宏列表并使用宏循环。

%macro survey(sampsize=100);
    proc sql noprint;
        select distinct id
        into :all_ids separated by ' '
        from have
        ;
    quit;

    %do i = 1 %to %sysfunc(countw(&all_ids.) );
        %let id = %scan(&all_ids., &i.);

        proc surveyselect data=have out=want_&id. sampsize=&sampsize.;
            where id = &id.;
        run;

    %end;
%mend;
%survey;

选项 3:地层

这不会为您提供每个 ID 的单独数据集,但您可以轻松地按 ID 分层并获取样本。

proc surveyselect data=have out=want sampsize=100;
    strata id;
run;