SAS:比较两个数字之间的值以制作单独的存储桶

时间:2013-08-07 18:51:54

标签: sas

我试图将多组数据放在两个数字之间的不同组中进行比较。最初我有声明,

if COLUMN1 gt 0 and COLUMN1 LE 1000 then PRICE_GROUP = 1000;

我的这个数字增加了1000到100,000。唯一的问题是,一旦我计算了每个price_group中的数量,就会丢失一些price_groups(57,000没有值,所以当我计算(Price_group)它不会出现在某些组中)。我认为解决方案是创建一个包含每个边界的表,然后比较实际值与上限和下限。

proc iml;

  mat = j(100,2,0);

  total = 100000;

  mat[1,1] = 0;
  mat[1,2] = mat[1,1] + (total/100);
  do i = 2 to nrow(mat);
        mat[i,1] = mat[i-1,1] +  (total/100);
        mat[i,2] = mat[i,1] + (total/100);
  end;

create dataset from mat;
append from mat;
quit;

这创建了我可以比较值的表,但除了proc iml之外还有更简单的方法吗?我接下来要做一个循环来比较每个值和两列,并在表上创建一个新列以在每个桶中计数。这仍然是一个效率低下的密集过程。

2 个答案:

答案 0 :(得分:1)

IML并不是一个糟糕的解决方案,但还有其他一些解决方案取决于你究竟在做什么。

最常见的是proc format。创建一个管理每个存储桶的格式,如下所示:

proc format;
value buckets
0-1000 = 1000
1000<-2000 = 2000
...
other="NA";
quit;

然后你可以使用格式(或信息)来创建一个带有bucketed值的新变量,或者更好的是,使用动态格式(即,在proc手段或诸如此类的东西),这不仅意味着你不要必须重写数据集,但您可以根据所需的桶数(例如,buckets100格式或buckets20以及诸如此类别)来打开和关闭格式。

其次,您的具体问题看起来只能使用数学来解决:

data want;
set have;
bucket = &total/100*(1+floor(column1/(&total/100)));
run;

虽然显然这并不适用于每个例子。

第三,如果您无法使用格式(例如,有两个或更多元素确定存储区),您可以使用哈希查找表。如果这有用,我可以扩展它,或只是谷歌,因为那些非常常用于SAS中的查找。这是常规datastep中最接近IML解决方案的解决方案。

答案 1 :(得分:0)

使用组创建另一个表:

data group_table;
do price_group=1000 to 100000 by 1000;
output;
end;
run;

然后使用price_group作为关键字将这个新表加入分组/比较表:

proc sql;
    create table price_group_compare as
    select L.price_group,R.group1_count,R.group2_count
    from group_table as L, group_counts as R
    on L.price_group = R.price_group;
quit;