Hi,
I have a panel dataset like below.
data have;
input Firm1 $ Firm2 $ Year flag ratio;
datalines;
AA1 BB 1995 0 0
AA1 BB 1996 0 0
AA1 BB 1997 0 0.5
AA1 BB 1998 1 0.6
AA1 BB 1999 0 0.5
AA1 CC 1995 0 0.4
AA1 CC 1996 0 0.3
AA1 CC 1997 0 0.2
AA1 CC 1998 1 0.1
AA1 CC 1999 0 0
AA2 DD 1995 0 0.9
AA2 DD 1996 1 0.5
AA2 DD 1997 0 0.4
AA2 DD 1998 1 0.6
AA2 DD 1999 0 0
AA2 EE 1995 1 0.3
AA2 EE 1996 1 0.4
AA2 EE 1997 0 0.9
AA2 EE 1998 0 0
AA2 EE 1999 0 0
;
run;
I would like to calculate the average where flag = 1 for each firm in Firm1 in each year. If there is no flag=1 in a year, the average is 0. The expected output is below.
Firm1 | Year | average |
AA1 | 1995 | 0 |
AA1 | 1996 | 0 |
AA1 | 1997 | 0 |
AA1 | 1998 | 0.35 |
AA1 | 1999 | 0 |
AA2 | 1995 | 0.3 |
AA2 | 1996 | 0.45 |
AA2 | 1997 | 0 |
AA2 | 1998 | 0.6 |
AA2 | 1999 | 0 |
what program do I need to use? Thanks.
Do you want a data set or a report?
Either approach could start with this modified data:
data have; input Firm1 $ Firm2 $ Year flag ratio; weightedratio = flag*ratio; datalines; AA1 BB 1995 0 0 AA1 BB 1996 0 0 AA1 BB 1997 0 0.5 AA1 BB 1998 1 0.6 AA1 BB 1999 0 0.5 AA1 CC 1995 0 0.4 AA1 CC 1996 0 0.3 AA1 CC 1997 0 0.2 AA1 CC 1998 1 0.1 AA1 CC 1999 0 0 AA2 DD 1995 0 0.9 AA2 DD 1996 1 0.5 AA2 DD 1997 0 0.4 AA2 DD 1998 1 0.6 AA2 DD 1999 0 0 AA2 EE 1995 1 0.3 AA2 EE 1996 1 0.4 AA2 EE 1997 0 0.9 AA2 EE 1998 0 0 AA2 EE 1999 0 0 ; run;
And then calculate the mean of the new variable.
Dataset:
proc summary data=have nway; class firm1 year; var weightedratio; output out=work.want (drop=_freq_ _type_) mean= run;
Report
proc report data=have; columns firm1 year weightedratio; define firm1 / group; define year / group; define weightedratio / mean; run;
Do you want a data set or a report?
Either approach could start with this modified data:
data have; input Firm1 $ Firm2 $ Year flag ratio; weightedratio = flag*ratio; datalines; AA1 BB 1995 0 0 AA1 BB 1996 0 0 AA1 BB 1997 0 0.5 AA1 BB 1998 1 0.6 AA1 BB 1999 0 0.5 AA1 CC 1995 0 0.4 AA1 CC 1996 0 0.3 AA1 CC 1997 0 0.2 AA1 CC 1998 1 0.1 AA1 CC 1999 0 0 AA2 DD 1995 0 0.9 AA2 DD 1996 1 0.5 AA2 DD 1997 0 0.4 AA2 DD 1998 1 0.6 AA2 DD 1999 0 0 AA2 EE 1995 1 0.3 AA2 EE 1996 1 0.4 AA2 EE 1997 0 0.9 AA2 EE 1998 0 0 AA2 EE 1999 0 0 ; run;
And then calculate the mean of the new variable.
Dataset:
proc summary data=have nway; class firm1 year; var weightedratio; output out=work.want (drop=_freq_ _type_) mean= run;
Report
proc report data=have; columns firm1 year weightedratio; define firm1 / group; define year / group; define weightedratio / mean; run;
Thank you, @ballardw
Opps. Read OP one more time .
data have;
infile cards expandtabs truncover;
input Firm1 $ Firm2 $ Year flag ratio;
weightedratio = flag*ratio;
datalines;
AA1 BB 1995 0 0
AA1 BB 1996 0 0
AA1 BB 1997 0 0.5
AA1 BB 1998 1 0.6
AA1 BB 1999 0 0.5
AA1 CC 1995 0 0.4
AA1 CC 1996 0 0.3
AA1 CC 1997 0 0.2
AA1 CC 1998 1 0.1
AA1 CC 1999 0 0
AA2 DD 1995 0 0.9
AA2 DD 1996 1 0.5
AA2 DD 1997 0 0.4
AA2 DD 1998 1 0.6
AA2 DD 1999 0 0
AA2 EE 1995 1 0.3
AA2 EE 1996 1 0.4
AA2 EE 1997 0 0.9
AA2 EE 1998 0 0
AA2 EE 1999 0 0
;
run;
proc sql;
select Firm1,year,case when sum(flag=1)=count(*) then avg(ratio)
when sum(flag=1)=0 then 0
else sum(flag*ratio)/sum(flag=1) end as average
from have
group by Firm1,year;
quit;
Thank you, @Ksharp
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9.
Lock in the best rate now before the price increases on April 1.
SAS' Charu Shankar shares her PROC SQL expertise by showing you how to master the WHERE clause using real winter weather data.
Find more tutorials on the SAS Users YouTube channel.