簡體   English   中英

SAS:崩潰和加權平均值計算

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM