*****我有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吗?但在这种情况下,我需要使用两次组来获得所需的结果。
答案 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;