我试图将多组数据放在两个数字之间的不同组中进行比较。最初我有声明,
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之外还有更简单的方法吗?我接下来要做一个循环来比较每个值和两列,并在表上创建一个新列以在每个桶中计数。这仍然是一个效率低下的密集过程。
答案 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;