1

我试图通过将它们放在两个数字之间的不同组中来比较多组数据。最初我有这样的陈述,

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

我把这个增加了 1000 到 100,000。唯一的问题是,一旦我计算了每个 price_group 中有多少个 price_groups,就会丢失一些 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 之外还有更简单的方法吗?接下来我将执行一个循环来将每个值与两列进行比较,并在表上创建一个新列以获取每个存储桶中的计数。这似乎仍然是一个低效的密集过程。

4

2 回答 2

1

IML 不是一个糟糕的解决方案,但还有其他一些解决方案,具体取决于您正在做什么。

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

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

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

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

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

尽管显然这不适用于每个示例。

第三,如果您无法使用格式(例如有两个或更多元素确定存储桶),您可以使用哈希查找表。如果这有用,我可以对此进行扩展,或者只是谷歌一下,因为这些在 SAS 中非常常用于查找。这是与常规数据步中的 IML 解决方案最接近的解决方案。

于 2013-08-07T21:03:26.123 回答
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;
于 2016-08-30T18:47:17.113 回答