2

我已经看到很多使用 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 组选择 1 行。问题是我不想只为每个我想从可用选项中选择一个随机或任意(以更容易做的)行选择第一个日期。有人知道我可以做到这一点吗?

4

2 回答 2

2

准系统解决方案:

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

根据您的目标,答案可能会略有变化。如果您正在引导(看起来您可能是),我发现这篇论文非常有用: 不要循环:重新采样和模拟 SAS® 方式

于 2013-06-18T16:59:32.267 回答
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 会将它们全部添加到一个文件中以查看。我确信有一种更简单的方法可以做到这一点,但这就是我的想法。

于 2013-06-18T15:35:31.977 回答