2014-01-29 42 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

相关问题