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
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;
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=whichn( helpv(I)+ 90, of help(*) );
@Shmuel Eagle eyes! Thanks!
Do i =1 to 370;
X = whichn(help(I) + 90, of help(*));
If x > 0 then leave;
End;
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
Please illustrate your problem with sample data amd expected output.
If you have any other restrictions make sure to highlight them.
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
ID | Day1 | Day2 | Day3 | Day4 | Day5 | Day6 | Day7 | Day8 | Day9 | Day10 | Day11 | Day12 |
Robin | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
Michael | 1 | 2 | 2 | 3 | 4 | 5 | 5 | 6 | 7 | 8 | 9 | 10 |
Jeremy | 1 | 2 | 3 | 3 | 4 | 5 | 6 | 6 | 7 | 7 | 7 | 7 |
Matt | 1 | 1 | 1 | 2 | 2 | 3 | 3 | 3 | 4 | 4 | 5 | 6 |
Sara | 1 | 2 | 3 | 4 | 5 | 5 | 5 | 6 | 6 | 7 | 8 | 9 |
Tony | 1 | 2 | 2 | 2 | 2 | 3 | 3 | 3 | 4 | 4 | 4 | 4 |
What is the expected output for data?
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
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;
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.
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;
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!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.