2014-01-29 90 views
1

我有一個數據集,用於從統一分佈中選擇隨機數。你如何只輸出這些行索引?我基本上想從SAS數據集中選擇一組隨機的行。如何從SAS數據集輸出一組隨機觀察值

data Unif(keep=u x k n m); 
call streaminit(123); 
a = -1; b = 1; 
Min = 1; Max = 28000000; 
do i = 1 to &NObs; 
    u = rand("Uniform"); /* U[0,1] */ 
    x = a + (b-a)*u;  /* U[a,b] */ 
    k = ceil(Max*u);  /* uniform integer in 1..Max */ 
    n = floor((1+Max)*u); /* uniform integer in 0..Max */ 
    m = min + floor((1+Max-Min)*u); /* uniform integer in Min..Max */ 
    output; 
end; 
keep k 
run; 
    *not sure about this part; 
    data final; 
    set final; 
    where obs in (k); 
    run; 
+0

你只是想隨機抽樣一些記錄?什麼是高層次的問題,詳細但英文(而不是代碼)? – Joe

+0

是的,我只是想從我的數據集中隨機獲得10個觀測值。 – lord12

回答

0

最好的辦法是使用PROC SURVEYSELECT

proc surveyselect data=final out=selected seed=123 n=10; 
run; 

或者沿東西取決於您希望如何運行這些線路 - the documentation對如何進行採樣的各種選項很多細節。

如果要在datastep中執行此操作,則需要以某種方式在第二個datastep內運行Unif中的代碼。我並不完全遵循它想要做的事情;如果這是K/N抽樣的形式,搜索「SAS K/N抽樣」,你會發現很多在那裏,因爲它是一個共同的問題,但一般的方法是

data final_selected; 
set final; 
... code to determine if it should be selected... 
if (condition); *subsetting if; 
run; 
+0

是否有創建的觀察指數變量?對於我的if語句,我想要一個聲明,說明obs(這些隨機索引),然後輸出; – lord12

+0

這不是一個很好的方法來做到這一點。以上兩種都選擇了你的10個(或其他),沒有這樣的陳述,而是採用了等價的方法(根據統一的隨機分佈進行選擇)。 – Joe

相關問題