【问题标题】:SAS/SQL Choose random row by groupSAS/SQL 按组选择随机行
【发布时间】:2013-06-14 20:19:50
【问题描述】:

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

【问题讨论】:

  • 你的最终目标是什么?有几种不同的方法可以做到这一点,但有些方法比其他方法更有效。您是在引导还是一次只需要一行?

标签: sql random sas rows


【解决方案1】:

准系统解决方案:

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

【讨论】:

  • 我正在尝试获取一个表,每个 ID 有一行。因此,如果每个 ID 有 3 个 obs 和 100 个 IDS,则最终数据集中将有 100 行,但为每个 ID 选择的行将是随机选择的
【解决方案2】:

我不确定如何从一个大文件中执行此操作,但我会编写一个循环将代码分成 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 会将它们全部添加到一个文件中以供查看。 我确信有一种更简单的方法可以做到这一点,但这是我的想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    相关资源
    最近更新 更多