[英]SAS: Collapsing and weighted averages calculations
我有一個無法自行解決的SAS編程問題,我為我的一切努力表示感謝。
我想按變量折疊數據集中的數據,並根據另一個變量給出的權重對兩個變量進行匯總/平均,然后將它們彼此相減:
示例數據
number flag volume measure1 measure2
1 A 1 2 2
2 B 2 4 5
3 A 5 8 20
4 B 10 4 1
5 A 9 10 11
6 B 5 2 9
7 A 4 11 23
8 B 3 1 8
現在:我想要度量1和度量2的體積加權平均值,然后計算度量1-度量2。 然后將所有這些按標志A和B分組:
Number Flag Volume VolWeightMeasure1 VolWeightMeasure2 FinalMeasure
1 A 19 ((1/19)*2)+((5/19)*8)+... ... (VolWeightMeasure1-VolWeightMeasure2)
2 B 20 ((2/20)*5)+((10/20)*1)+... ... (VolWeightMeasure1-VolWeightMeasure2)
因此基本上會崩潰,但要使用體積加權度量,然后再減去兩者。 謝謝您的投入!
最好
這可以使用兩個嵌套的SET
語句(通常稱為雙重Do-Loop-of-Whitlock)在單個數據datastep
完成。
第一個循環匯總VOLUME
的值。 在第二個循環中,將計算公式。 每組只有一個值進入輸出。
data have;
input flag $ volume measure1 measure2;
datalines;
A 1 2 2
B 2 4 5
A 5 8 20
B 10 4 1
A 9 10 11
B 5 2 9
A 4 11 23
B 3 1 8
run;
proc sort data = have; by flag; run;
data want;
do _n_ = 1 by 1 until (last.flag);
set have;
by flag;
sum_vol = sum(sum_vol,volume);
end;
do _n_ = 1 by 1 until (last.flag);
set have;
by flag;
VolWeightMeasure1 = sum(VolWeightMeasure1,(volume/sum_vol)*measure1);
VolWeightMeasure2 = sum(VolWeightMeasure2,(volume/sum_vol)*measure2);
end;
FinalMeasure = VolWeightMeasure1 - VolWeightMeasure2;
drop volume measure1 measure2;
rename sum_vol = Volume;
run;
proc sql;
select flag,sum_volume,sum1/sum_volume as volweightmeasure1,sum2/sum_volume as volweightmeasure2,
calculated volweightmeasure1-calculated volweightmeasure2 as finalmeasure
from (select flag,sum(volume) as sum_volume, sum(volume*measure1) as sum1, sum(volume*measure2) as sum2 from have group by flag);
quit;
如果您對proc摘要/方法感到滿意,則可以使用它進行大部分操作:
proc summary data=have nway;
class flag;
var measure1 measure2;
wgt volume;
output out=wantcomp(drop=_:) sumwgt=Volume mean=VolWeightMeasure1 VolWeightMeasure2;
run;
data want;
set want;
FinalMeasure = VolWeightMeasure1-VolWeightMeasure2;
run;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.