如何从表中选择具有与另一个表中的数值类似的数值的行?

时间:2012-06-23 14:25:05

标签: sas

我有一组测试和控制数据。测试组和控制组的表都有cust_id和NRx(数值)。测试组中的行仅为300,而对照组为40,000。我需要使用SAS选择300-400行对照组作为另一个表,使得对照组中的NRx在合理范围内与测试组的NRx紧密匹配。请帮忙!

4 个答案:

答案 0 :(得分:1)

最好的方法可能是对排序控制列表进行第n个样本。

在SQL中,您可以使用以下构造在某些数据库中执行此操作:

select t.*
from (select t.*, row_number() over (order by cust_id) as seqnum
      from t
     ) t
where mod(t, 100) = 7

这将为测试组选择从第7个开始的每百个记录。

大多数数据库都支持row_number()函数。如果你没有,那么你可以在SAS的数据步骤中轻松做同样的事情。

答案 1 :(得分:0)

选择最接近测试组平均值的300。或者,将对照组与测试组成比例,并按照测试组中的分布比例从样本中抽取样本。

答案 2 :(得分:0)

首先确定您的选择标准(您对“合理范围”的评论);假设您想要包含来自CONTROL的记录,这些记录在SAMPLE的平均值的正负一个偏差范围内。试试这个(一个简单的随机样本,无需替换,请参阅this SAS note):

proc sql noprint;
  /* Find mean and std dev of TEST group into two macro variables */
  select mean(nrx)
      ,  std(nrx) 
  into :mean_nrx, :std_nrx
  from TEST;

  /* Create TARGET based on +/- 1 std deviation  */
  create table TARGET as
  select *
  from   CONTROL
  where  NRx between (&mean_nrx - &std_nrx) and (&mean_nrx + &std_nrx);
quit;

/* Create sample of size K from TARGET */
data sample(drop=k n);

  retain k 300 n;
  if _n_=1 then n=total;
  set TARGET nobs=total;

  if ranuni(1230498) <= k/n then do;
     output;
     k=k-1;
     end;

  n=n-1;

  if k=0 then stop;
run;

请注意,这会创建一个包含符合样本条件的记录的TARGET数据集。将K的值更改为您想要的任何样本大小。

答案 3 :(得分:0)

proc sql函数monotonic()将为您提供行号。

不支持/记录,因此请勿在生产系统中使用