2013-06-18 181 views
2

我已經看到了很多不同的解決方案,使用MYSQL但他們使用的一些功能在SAS中不起作用。我有一個非常大的客戶記錄列表,如下所示:SAS/SQL隨機選擇隨機行

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

而且我需要爲每個ID組只選擇一行。事情是我不想只選擇每個我想從可用選項中隨機選擇或任意選擇(以較容易的方式)的第一個日期。有人知道我能做到這一點嗎?

+0

你最終的目標是什麼?有幾種不同的方法可以做到,但有些方法比其他方法更有效。你是引導還是一次只需要一行? –

回答

2

準系統解決方案:

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

根據你的目標,答案可能會略有不同。如果你是bootstrapping(看起來你可能是),我發現這篇文章非常有用: Don't Be Loopy: Re-Sampling and Simulation the SAS® Way

+0

我想要獲得一張表,每個ID有一行。因此,如果每個ID有3個obs和100個IDS,那麼最終數據集中將有100行,但是爲每個ID選擇的行將隨機選擇 – jswtraveler

+0

該代碼應該準確提供您要查找的內容。 –

+0

它的確如此。非常感謝!! – jswtraveler

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然後將它們全部添加到一個文件中來查看。 我確信有一個更簡單的方法來做到這一點,但這是我想到的。