SAS/SQL按组随机选择行

3

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


你的最终目标是什么?有几种不同的方法可以实现,但有些比其他方法更高效。你是在自助启动还是只需要一次获取一行数据? - undefined
2个回答

2

简单的解决方案:

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

根据您的目标,答案可能会略有不同。如果您正在进行自助启动(似乎是这种情况),我发现这篇论文非常有用:不要被循环限制:使用SAS®重新采样和模拟


我正在尝试获取一个单表,每个ID只有一行数据。因此,如果每个ID有3个观察值,而有100个ID,则最终数据集中将有100行,但选择的每个ID行都是随机选择的。 - undefined

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会将它们全部合并到一个文件中以供查看。 我相信有更简单的方法来做这个,但这是我想到的办法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接