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

SAS:比较两个数字之间的值以形成单独的存储桶,sas,Sas,我试图通过将多组数据分别放在两个数字之间来比较它们。最初我有这样的陈述 if COLUMN1 gt 0 and COLUMN1 LE 1000 then PRICE_GROUP = 1000; 我把这个数字提高了1000到100000。唯一的问题是,一旦我计算了每个price_组中有多少个,一些price_组就丢失了(57000个没有值,所以当我计算(price_组)时,它不会出现在某些组中)。我认为解决方案是制作一个表,每个表都有边界,然后比较实际值与上限和下限 proc iml; m

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

if COLUMN1 gt 0 and COLUMN1 LE 1000 then PRICE_GROUP = 1000;
我把这个数字提高了1000到100000。唯一的问题是,一旦我计算了每个price_组中有多少个,一些price_组就丢失了(57000个没有值,所以当我计算(price_组)时,它不会出现在某些组中)。我认为解决方案是制作一个表,每个表都有边界,然后比较实际值与上限和下限

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之外还有更简单的方法吗?接下来,我将执行一个循环,将每个值与两列进行比较,并在表上创建一个新列,以在每个bucket中包含计数。这似乎仍然是一个效率低下的密集过程。

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

最常见的是
proc格式
。创建管理每个bucket的格式,如下所示:

proc format;
value buckets
0-1000 = 1000
1000<-2000 = 2000
...
other="NA";
quit;
虽然很明显,这并不适用于所有的例子


第三,如果无法使用格式(例如有两个或多个元素决定bucket),则可以使用哈希查找表。如果这有用的话,我可以扩展一下,或者只是用谷歌搜索一下,因为这是SAS中非常常用的查找方法。这是与常规数据步骤中的IML解决方案最接近的解决方案。

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

最常见的是
proc格式
。创建管理每个bucket的格式,如下所示:

proc format;
value buckets
0-1000 = 1000
1000<-2000 = 2000
...
other="NA";
quit;
虽然很明显,这并不适用于所有的例子


第三,如果无法使用格式(例如有两个或多个元素决定bucket),则可以使用哈希查找表。如果这有用的话,我可以扩展一下,或者只是用谷歌搜索一下,因为这是SAS中非常常用的查找方法。这是与常规数据步骤中的IML解决方案最接近的解决方案。

创建另一个包含组的表:

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;

创建另一个包含组的表:

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;