如何通过 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;
尝试不同的方法。我有一个包含 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;