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

Hi Everyone,

 

I have a start variable having value 1.

When value =1, I want to run the below 2 data steps.

Of course, I can run the whole process on every single record but it is not optimal.

I appreciate it if you could help me.

HHC

 

 

data have;
input start order value;
datalines;
0 1 5
0 2 2
0 3 4
0 4 4
0 5 5
0 6 2
0 7 7
0 8 1
0 9 13
0 1 10 5
0 1 56
0 2 26
0 3 46
0 4 46
0 5 18
0 6 58
0 7 8
0 8 2
0 9 100
1 10 5
;
run;

 

 

IF START=1 THEN DO THE FOLLOWING PROCESS

 

data want;

 

 

set have;
drop aa1-aa10;
array a{0:9} aa1-aa10;
retain aa:;
pct_60=largest((10-10*60/100+1),of a{*});
pct_70=largest((10-10*70/100+1),of a{*});
pct_80=largest((10-10*80/100+1),of a{*});
pct_90=largest((10-10*90/100+1),of a{*});
a{mod(_n_,10)}=value;
run;


data want; set want;
drop pct_25-pct_100 ;
if value>=pct_90 then ROC_rank=5;
else if value>=pct_80 then ROC_rank=4;
else if value>=pct_70 then ROC_rank=3;
else if value>=pct_60 then ROC_rank=1.5;
else ROC_rank=0.1;
run;

1 ACCEPTED SOLUTION

Accepted Solutions
PGStats
Opal | Level 21

I'm not certain I understand fully. It seems like you want to compare value with the preceeding 10 values and set ROC_rank based on the ranking of value relative to the set of 10. Furthermore, you want output only for cases where start=1. The role of variable order is undefined. This would do that:

 

data want;
set have;
array a{0:9} _temporary_;
if start and nmiss(of a{*})=0 then do;
    if      value>=largest(1,of a{*}) then ROC_rank=5;
    else if value>=largest(2,of a{*}) then ROC_rank=4;
    else if value>=largest(3,of a{*}) then ROC_rank=3;
    else if value>=largest(4,of a{*}) then ROC_rank=1.5;
    else                                   ROC_rank=0.1;
    output;
    end;
a{mod(_n_,10)}=value;
run; 

 

PG

View solution in original post

4 REPLIES 4
PGStats
Opal | Level 21

Your example code generates an error: it is interrupted because of looping. What is it intended to do?

PG
hhchenfx
Rhodochrosite | Level 12

Sorry for not deleting the IF statement.

Here is the clean one.

Thank you for helping, PGStats.

HHC

 

data have;
input start order value;
datalines;
0 1 5
0 2 2
0 3 4
0 4 4
0 5 5
0 6 2
0 7 7
0 8 1
0 9 13
0 1 10 5
0 1 56
0 2 26
0 3 46
0 4 46
0 5 18
0 6 58
0 7 8
0 8 2
0 9 100
1 10 5
;
run;

 

 

*IF START=1 THEN DO THE FOLLOWING PROCESS;

 

data want;

 

 

set have;
drop aa1-aa10;
array a{0:9} aa1-aa10;
retain aa:;
pct_60=largest((10-10*60/100+1),of a{*});
pct_70=largest((10-10*70/100+1),of a{*});
pct_80=largest((10-10*80/100+1),of a{*});
pct_90=largest((10-10*90/100+1),of a{*});
a{mod(_n_,10)}=value;
run;


data want; set want;
drop pct_25-pct_100 ;
if value>=pct_90 then ROC_rank=5;
else if value>=pct_80 then ROC_rank=4;
else if value>=pct_70 then ROC_rank=3;
else if value>=pct_60 then ROC_rank=1.5;
else ROC_rank=0.1;
run;

PGStats
Opal | Level 21

I'm not certain I understand fully. It seems like you want to compare value with the preceeding 10 values and set ROC_rank based on the ranking of value relative to the set of 10. Furthermore, you want output only for cases where start=1. The role of variable order is undefined. This would do that:

 

data want;
set have;
array a{0:9} _temporary_;
if start and nmiss(of a{*})=0 then do;
    if      value>=largest(1,of a{*}) then ROC_rank=5;
    else if value>=largest(2,of a{*}) then ROC_rank=4;
    else if value>=largest(3,of a{*}) then ROC_rank=3;
    else if value>=largest(4,of a{*}) then ROC_rank=1.5;
    else                                   ROC_rank=0.1;
    output;
    end;
a{mod(_n_,10)}=value;
run; 

 

PG
hhchenfx
Rhodochrosite | Level 12

Hi PGStats,

 

Your code work perfectly in this case. And yes, I only need to output record with start=1.

 

However, I did not foresee that it can be done in only 1 step.

And my code to run when start=1 involve few other steps.

 

So it is the best for me if I can put the MAIN analysis section within some kind IF as below.

It will help me alot for other applicaiton as well.

 

Thank you so much.

 

HHC

 

IF start=1 then do;

 

data want;
set have;
drop aa1-aa10;
array a{0:9} aa1-aa10;
retain aa:;
pct_60=largest((10-10*60/100+1),of a{*});
pct_70=largest((10-10*70/100+1),of a{*});
pct_80=largest((10-10*80/100+1),of a{*});
pct_90=largest((10-10*90/100+1),of a{*});
a{mod(_n_,10)}=value;
run;

 

END;

 


data want; set want;
drop pct_25-pct_100 ;
if value>=pct_90 then ROC_rank=5;
else if value>=pct_80 then ROC_rank=4;
else if value>=pct_70 then ROC_rank=3;
else if value>=pct_60 then ROC_rank=1.5;
else ROC_rank=0.1;
run;

SAS Innovate 2025: Register Now

Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
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.

SAS Training: Just a Click Away

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

Browse our catalog!

Discussion stats
  • 4 replies
  • 917 views
  • 0 likes
  • 2 in conversation