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;