需要计算两个级别的加权平均值

时间:2014-03-28 02:01:43

标签: sql sas

*****我有400万观察。我有一个变量X,它有100个独特的观察值,分配了5位数代码(e.x.10420,49660,52739,65231等)并按升序排列。在这些独特的X中,我有变量Y,其代码为1-4。现在我需要计算Y的每个代码的加权平均值以及X的每个Y代码的加权平均值。 所以有两个阶段:内部阶段是根据每个X的每个Y代码计算加权平均值,外部阶段是根据Y的每个代码计算整体X **的加权平均值。***

X      wrkallmt  medtt_all  Y
-----  --------  ---------  --
10420  15        25.4       1
10420  50        5.7        4
10420  70        5.9        3
10420  110       5.9        4
10420  110       15         2
12630  30        15.8       4
12630  15        10.9       2
12630  85        10.5       2
12630  20        20.7       1
12630  20        23.5       3
13560  20        20.3       3
13560  20        20.8       3
13560  30        20.9       4
13560  20        25.5       2
13560  25        30.6       4
13560  20        45.3       1
13560  20        40.4       4
13560  20        30.9       1
13560  10        10.8       2

内部阶段:对于代码1的每个X的假设x = 10420加权平均值为(15*25.4)/15,代码4为((50*5.7)+(110*5.9))/(50+110)。  外部阶段:代码1的加权平均值是(10420中的代码1的加权值,12630中的代码1的加权值,13560中的代码1的加权值)/(x中代码1中的wrkallmt的总和)


我只能想到使用嵌套的DO-LOOP。我想出了内在阶段,但无法构建外部阶段:

data WORK.exp3;
   SET WORK.ABC;
   do X = ??;
      A = 0;
      B = 0;
      wgtavg_all = 0;
      do Y = 1 to 4;
         A = sum(wrkallmt*medtt_all);
         B = sum(wrkallmt);
         wgtavg_all = A/B;
         output;
      end;
      output;
   end;
run; 

我使用的是SAS 9.3。 我可以使用group by来使用proc sql吗?但在这种情况下,我需要使用两次组来获得所需的结果。

1 个答案:

答案 0 :(得分:0)

肯定有不止一种方法可以做到这一点,但看看这是否接近你想要的。 这需要2种类型,但在DATA STEP中利用BY statement(以及最后一个临时变量)。

data have;
 length x y 8.;
 Input X wrkallmt medtt_all Y;
 datalines;
10420 15 25.4 1
10420 50 5.7 4
10420 70 5.9 3
10420 110 5.9 4
10420 110 15 2
12630 30 15.8 4
12630 15 10.9 2
12630 85 10.5 2
12630 20 20.7 1
12630 20 23.5 3
13560 20 20.3 3
13560 20 20.8 3
13560 30 20.9 4
13560 20 25.5 2
13560 25 30.6 4
13560 20 45.3 1
13560 20 40.4 4
13560 20 30.9 1
13560 10 10.8 2
;

proc sort data=have out=sortedx;
 by x y;
run;

Data need1(keep=x y weighted_avg_combined_y);
 retain a b 0;
 set sortedx;
 by x y;

 a = a + (wrkallmt * medtt_all);
 b = b + wrkallmt;

 if last.y then do;
  weighted_avg_combined_y=a/b;
  output ;
 end;

run;

Proc sort data=have out=sortedy;
 by y x;
run;

Data need2(keep=x y weighted_avg_all_y);
 retain a b 0;
 set sortedy;
 by y x;

 a = a + (wrkallmt * medtt_all);
 b = b + wrkallmt;

 if last.y then do;
  weighted_avg_all_y=a/b;
  output ;
 end;

run;