BookmarkSubscribeRSS Feed
div44
Calcite | Level 5

Hello,

 

I am stuck at where I need to find the ith observation which is equal to the ith observation + 90. For example if my i=1 value is 2, then I need to find m?, where the value would be 2+90 = 92.

 

I am using this code.

 

data x;

set y;

array help(*) 1-370;

do i = 1 to 370;

do m = 1 to 370;

if help(i) + 90 = help(m) then leave;

end;

run;

 

Thank you

 

11 REPLIES 11
Reeza
Super User

You don't need two loops. 

Can you have multiple matches? 

 

The WHICHN function can return the index of an array that contains the value you're looking for. 

 

Do i = 1 to 370;

x=whichnhelpv(I)+ 90, of help(*));

if x>0 then leave;

end;

Shmuel
Garnet | Level 18

It seems like a typo defining: array help(*) 1-370;

You probably meant, something like: array help(*) v1-v370;

 

@Reeza you meant to write (missed open bracket):

       x=whichnhelpv(I)+ 90, of help(*) );

    

Reeza
Super User

@Shmuel Eagle eyes! Thanks!

 

Do i =1 to 370;
X = whichn(help(I) + 90, of help(*));
If x > 0 then leave;
End;
div44
Calcite | Level 5

Thank you so much for the help. The codes worked, however I want x-i to be less than 180. If x-i crosses 180 then I would want to select that value of i which would give me x-i<180.

 

Thanks once again

Reeza
Super User

Please illustrate your problem with sample data amd expected output. 

If you have any other restrictions make sure to highlight them. 

 

div44
Calcite | Level 5

Please find a sample dataset

It is a dataset of students and their attendance, which is cumulative over 12 days. I need to find the earliest day when their attendance crossed 5 days over a period of 7 days.  Thank you

 

IDDay1Day2Day3Day4Day5Day6Day7Day8Day9Day10Day11Day12
Robin123456789101112
Michael1223455678910
Jeremy123345667777
Matt111223334456
Sara123455566789
Tony122223334444
Reeza
Super User

What is the expected output for data?

div44
Calcite | Level 5

Expected output 

 

Name   Start_day  Day_crossing_5

Robin          1                   5

Michael       1                   6

Jeremy        1                  6

Matt            5                   12

Sara           1                    5

Tony           .                      .

 

It does not need to be the first day, if using the first day at start_date does not give the answer, then I want the program to move to the next one. In this way the start_day for Matt reached 5, because on day12 his value was 5 greater than the value(2) on day5. So over a period of 7days he crossed 5 attendace units. If you would have used day1 as start date for Matt, he would have reached only 3 by day 7. Does that help ?

 

Thanks, 

Divyan 

Shmuel
Garnet | Level 18

You are posting a very similar situation to your previous question.

Here is @Reeza's solution addapted to your last post:

 

array dayx day1-day12;
Do i =1 to 12; X = whichn(dayx(I) > 5 , of dayx(*)); If x > 0 then leave; End;
 

 

div44
Calcite | Level 5

Thank you for the answer, but then how would I restrict my lookup period to 7 days. I do not want to include any observations if they occur after 7 days.

Shmuel
Garnet | Level 18

I'm not sure I understand what you mean.

Anyhow, you can filter the output by adding a line after END of the DO loop, like:

 

 

IF i > 7 then delete;

 

Ready to join fellow brilliant minds for the SAS Hackathon?

Build your skills. Make connections. Enjoy creative freedom. Maybe change the world. Registration is now open through August 30th. Visit the SAS Hackathon homepage.

Register today!
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
  • 11 replies
  • 1835 views
  • 2 likes
  • 3 in conversation