BookmarkSubscribeRSS Feed
vraj1
Quartz | Level 8
data want;
set test(drop=exd);
by id day;
if first.id then call missing(_cp, _co);
if period='A' then do;
       if ext='pine' then do; _cp+1; exd=2*min(int((_cp+1)/2),3); end;
  else if ext='ozi'  then do; _co+1; exd=5*min(int((_co+1)/2),3); end;
end;                                     
drop _:;
run;
 

EXT is "pine", EXD should be assigned by value 2 for the first 2 days, value 4 for the next 2 days and value 6 for the remaining Period A. If EXT is "ozi", EXD should be assigned by value 5 for the first 2 days, value 10 for the next 2 days and value 15 for the remaining Period A.

 

I want to modify this code based on start and end dates and val should be incremented by 2,4,6 every 2 days . if for ext="pine" it should have first value as 2 and calculated what the next value will be based for the test data. First record for ext=pine val is 2 and the duration is 8 days 12-may-2018 to 19-may-2018=8

next record 20-may to 29 may then val for same id will be incremented from first record based on dates.

 

Any help?

3 REPLIES 3
mkeintz
PROC Star

Please show a table demonstrating the values of EXD.  It is not clear whether your day-count is within EXT class, or accros EXT classes.  An output table would help answer such questions.

--------------------------
The hash OUTPUT method will overwrite a SAS data set, but not append. That can be costly. Consider voting for Add a HASH object method which would append a hash object to an existing SAS data set

Would enabling PROC SORT to simultaneously output multiple datasets be useful? Then vote for
Allow PROC SORT to output multiple datasets

--------------------------
ballardw
Super User

@vraj1 wrote:
data want;
set test(drop=exd);
by id day;
if first.id then call missing(_cp, _co);
if period='A' then do;
       if ext='pine' then do; _cp+1; exd=2*min(int((_cp+1)/2),3); end;
  else if ext='ozi'  then do; _co+1; exd=5*min(int((_co+1)/2),3); end;
end;                                     
drop _:;
run;
 

EXT is "pine", EXD should be assigned by value 2 for the first 2 days, value 4 for the next 2 days and value 6 for the remaining Period A. If EXT is "ozi", EXD should be assigned by value 5 for the first 2 days, value 10 for the next 2 days and value 15 for the remaining Period A.

 

I want to modify this code based on start and end dates and val should be incremented by 2,4,6 every 2 days . if for ext="pine" it should have first value as 2 and calculated what the next value will be based for the test data. First record for ext=pine val is 2 and the duration is 8 days 12-may-2018 to 19-may-2018=8

next record 20-may to 29 may then val for same id will be incremented from first record based on dates.

 

Any help?


I am not at all sure what you mean by "first 2 days", or "next 2 days". How do you mean values of your "day" variable? Are you "day" variable values continuous? duplicated? are you sure there "next 2 days" or next 4 or what not?

 

Some example input data and the expected results for that input would clear things up.

vraj1
Quartz | Level 8

First id needs to have exd as 2 and the next as 4 and the rest 6 for 

ext='pine'

 for 

ext='ozi'

it should have first id it should 5 then second record 10 and the rest as 15.

ext='ozi'

 

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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 3 replies
  • 1026 views
  • 0 likes
  • 3 in conversation