SAS / SQL逐个组地随机选择

时间:2013-06-18 14:45:38

标签: sql random sas rows

我已经使用MYSQL看到了相当多的不同解决方案,但是他们使用的一些功能在SAS中不起作用。我有一个非常大的客户记录列表,如下所示:

DATE      ID    .........  
1/31/13   1    ............  
1/31/13   2    ...........  
2/28/13   1    ............  
3/31/13   1   ............  
3/31/13   2    ............  

我需要为每个ID组选择一行。问题是我不想只为每个选择第一个日期我想从可用选项中选择随机或任意(以较容易做的)行。有人知道我能做到这一点吗?

2 个答案:

答案 0 :(得分:2)

Barebones解决方案:

Proc SurveySelect data=Have out=Want noprint
    Method = urs
    N = 1
    outhits
    rep = 1;
    Strata Id ;
run;

根据您的目标,答案可能略有变化。如果您正在进行自举(您可能会出现这种情况),我发现这篇论文非常有用: Don't Be Loopy: Re-Sampling and Simulation the SAS® Way

答案 1 :(得分:0)

我不确定如何从一个大文件中执行此操作,但我会编写一个循环将代码拆分为id组,然后进行随机抽样。

%macro MACRO();
proc sql noprint;
    select ID into :ID separated by " "
    from Original_table
    ;
quit;

proc sql noprint;
    select count (*) into :NumIDs
    from Original_table
    ;
quit;

%let NumID = &NumIDs;

%do i = 1 %to &NumID %by 1;
    %let loopID = %scan(&ID, &i, " ");

proc sql;
    create table ID_&loopID. as
    select *
    from Original_table
    where ID = &loopID.
    ;
quit;

    proc surveyselect data = ID&loopID. method = SRS rep = 1
    sampsize = 1 out = RandomID_&loopID.;
    id _all_;
run;

    proc append base = Id_Random_all
    data = RandomID_&loopID.
    ;
quit;


%end;
%mend;
%MACRO();

proc append然后将所有这些添加到一个文件中以供查看。 我确信有一种更简单的方法可以做到这一点,但这就是我的想法。