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

Hi Everyone,

I am a new student, new to SAS, and new to SAS community. I am hoping that you guys will be able to help me with my data problem. I have companies information that I need help with. Here is a sample of the data:

CoIDYearProfitR&DEx
1231998-10015

123

1999-10010
123200015015
123200120020
45619995010
456200010.
4562001-2515
7891999150.
7892000-100.
789200150.
7892002100.

In this table, the first variable "CoID" is company id which is a character in SAS and I want to keep it that way. The second column is the year, which is in number format. The third column is the profit (which can be negative) and the fourth column is Research and Development Expense.

What I want to do with the data is following things:

1) Create a variable called "R&DExAvg" which is the average of the R&D Expense for each company. 

2) Create a variable called "R&DMwAvg" which will be filled the missing value of R&D Expense with the average of that variable with respect to that company. If every R&D Expense value is missing, then keep that variable missing as well. If R&D Expense value is filled, then keep that variable same as R&DEx.

3) Create a variable called "Lossin2K" which will be filled with 1 for every value of that company if the profit was below zero during the year 2000 otherwise it will be 0.  

4) Create a variable called "Lossporin2K2" which will be filled with 1 for every value of that company if the profit was below zero two years in a row or more during the year 2000 or before otherwise it will be 0.  

This is what I need to have after the above mentioned programming done:

CoIDYearProfitR&DExR&DExAvgR&DMwAvgLossin2KLossporin2K2
1231998-10015151501

123

1999-10010151001
123200015015151501
123200120020152001
4561999501012.51000
456200010.12.512.500
4562001-251512.51500
7891999150...10
7892000-100...10
789200150...10
7892002100...10

I know it is lot to ask but please help me out. I would appreciate if you can help me out with separate data statement for each variable and keeping it simple (please no macro!).

Once again thanks,

The Rock

1 ACCEPTED SOLUTION

Accepted Solutions
Ksharp
Super User

"if the profit was below zero two years in a row or more during the year 2000 "

You mean year less than and equal 2000 ?

Code: Program

data have;
   length coid $4 year  profit  rndex 8;
   input coid year profit rndex;
datalines;
123 1998 -100 15
123 1999 -100 10
123 2000 150 15
123 2001 200 20
456 1999 50 10
456 2000 10 .
456 2001 -25 15
789 1999 150 .
789 2000 -100 .
789 2001 50 .
789 2002 100 .
;
run;
proc sql;
create table want as
select *,mean(rndex) as rndex_avg,
   coalesce(rndex,calculated rndex_avg) as rndex_Mwavg,
   case
   when (select profit from have where coid=a.coid and year=2000) lt 0 then 1
   else 0
   end as Lossin2K,
   case
   when (select count(*) from have where coid=a.coid and year le 2000 and profit lt 0) gt 1 then 1
   else 0
   end as Lossporin2K2
   from have as a
   group by coid ;
quit;

View solution in original post

6 REPLIES 6
evp000
Quartz | Level 8

Hi,

This is not the whole answer but it will get you started.

data co1;

    length coid $4 year  profit  rndex 8;

    input coid year profit rndex;

datalines;

123 1998 -100 15

123

1999 -100 10

123 2000 150 15

123 2001 200 20

456 1999 50 10

456 2000 10 .

456 2001 -25 15

789 1999 150 .

789 2000 -100 .

789 2001 50 .

789 2002 100 .

;

run;

proc sql;

    create table co2 as

    select *, mean(rndex) as rndexavg

    from co1

    group by coid;

quit;

You can't use an ampersand in a SAS variable name.

Ksharp
Super User

"if the profit was below zero two years in a row or more during the year 2000 "

You mean year less than and equal 2000 ?

Code: Program

data have;
   length coid $4 year  profit  rndex 8;
   input coid year profit rndex;
datalines;
123 1998 -100 15
123 1999 -100 10
123 2000 150 15
123 2001 200 20
456 1999 50 10
456 2000 10 .
456 2001 -25 15
789 1999 150 .
789 2000 -100 .
789 2001 50 .
789 2002 100 .
;
run;
proc sql;
create table want as
select *,mean(rndex) as rndex_avg,
   coalesce(rndex,calculated rndex_avg) as rndex_Mwavg,
   case
   when (select profit from have where coid=a.coid and year=2000) lt 0 then 1
   else 0
   end as Lossin2K,
   case
   when (select count(*) from have where coid=a.coid and year le 2000 and profit lt 0) gt 1 then 1
   else 0
   end as Lossporin2K2
   from have as a
   group by coid ;
quit;
therock
Calcite | Level 5

Yes I mean less than or equal to.

Thank you so much for the help. It worked perfectly.

I have never used proc SQL before and I need to learn about it. Do you have any guidance on where to start?

Once again, Thank you!!!

Ksharp
Super User

SAS documentation about SQL is a good start . Search it at support.sas.com

therock
Calcite | Level 5

Thanks to both Xia Keshan and EM@sas on info about the SAS SQL documentation.

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 6 replies
  • 1013 views
  • 0 likes
  • 4 in conversation