BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
dapenDaniel
Obsidian | Level 7

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.

Firm1Yearaverage
AA119950
AA119960
AA119970
AA119980.35
AA119990
AA219950.3
AA219960.45
AA219970
AA219980.6
AA219990

 

what program do I need to use? Thanks.

1 ACCEPTED SOLUTION

Accepted Solutions
ballardw
Super User

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; 

View solution in original post

4 REPLIES 4
ballardw
Super User

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; 
dapenDaniel
Obsidian | Level 7

Thank you, @ballardw 

Ksharp
Super User

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;

 

 

dapenDaniel
Obsidian | Level 7

Thank you, @Ksharp