2014-06-29 33 views
2

对于expamle,我有一个表A,其中有两个变量,第一个是客户ID,第二个是客户的收入,范围从100到200美元。我的任务是创建一个表格B,在那里我的客户的平均收入是150美元,客户数量应该是最大的。换句话说,我需要拥有表B,其中来自表A的客户数量最多,而表B的客户之间的收入均值应该完全等于150.有没有使用SAS Enterprise Guide的优雅方法?选择变量的均值(SAS)

+0

我不认为有一个优雅的方法来获得这样一个最大的子集。如果有的话,我也很好奇。 –

回答

1

按收入对记录进行排序,由低到高排序。然后计算所有记录的平均值1-N。找到N其中平均值= 150.

data test; 
do id = 1 to 1000; 
income = 100 + round(ranuni(1)*100,1); 
output; 
end; 
run; 

proc sort data=test; 
by income; 
run; 

data want(where=(ave<=150)); 
set test; 

retain sum 0; 

sum = sum + income; 
ave = sum/_n_; 

drop sum; 
run; 

您希望获得尽可能多的低值。然后这可以让你添加大的值来使平均值达到150.所以按收入排序应该给你你想要的。

0

一个贪婪算法可以很好地完成这项工作,具体取决于数据的结构。这绝对不能保证是最佳的,但它可以相对较快地实施。

的理念是:

  1. 计算的所有记录平均
  2. 如果平均是$ 150,然后停止
  3. 删除,以增加或降低平均最大/最小值酌情
  4. 如果平均为$ 150随后停止
  5. 重复(1),直到完成

这应该工作得很好,如果价值大约150美元。如果他们广泛分散,那么你可能不会在最后的箱子里得到任何记录。

如果算法适用于您的数据,那么可能会有更快的方法来实现它。