I am new to SPSS and I am trying to figure out how mix a do-loop with an array to do the following:
write a SAS code using SAS data step only and “do loop” so that you can modify the above data set to get a new data set having 21 variables (X1-X21) which will look like below:
X1 X2 X3 … X21
1 . . .
2 1 . .
3 2 1 .
21 19 18 1
The data set used is the following:
data example;
input X;
datalines;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
;
RUN;
I am trying to figure out the shortest way to get the proper output and if someone could help me out and give me some tips I would be very greatful.
There are users on here that are much, much better at DO loops compared to me. This is my best shot, and I'm certain there is a better method.
data example;
input X;
datalines;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
;
RUN;
data want;
set example;
array _x [*] 3. x1 - x21;
do i = 1 to dim(_x);
if i = 1 then do;
_x[i] = x;
end;
else do;
_x[i] = lag(_x[i-1]);
end;
end;
run;
I think there might be a typo in your 'want' data set, or I did something wrong.
X x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 1 1 . . . . . . . . . . . . . . . . . . . . 2 2 1 . . . . . . . . . . . . . . . . . . . 3 3 2 1 . . . . . . . . . . . . . . . . . . 4 4 3 2 1 . . . . . . . . . . . . . . . . . 5 5 4 3 2 1 . . . . . . . . . . . . . . . . 6 6 5 4 3 2 1 . . . . . . . . . . . . . . . 7 7 6 5 4 3 2 1 . . . . . . . . . . . . . . 8 8 7 6 5 4 3 2 1 . . . . . . . . . . . . . 9 9 8 7 6 5 4 3 2 1 . . . . . . . . . . . . 10 10 9 8 7 6 5 4 3 2 1 . . . . . . . . . . . 11 11 10 9 8 7 6 5 4 3 2 1 . . . . . . . . . . 12 12 11 10 9 8 7 6 5 4 3 2 1 . . . . . . . . . 13 13 12 11 10 9 8 7 6 5 4 3 2 1 . . . . . . . . 14 14 13 12 11 10 9 8 7 6 5 4 3 2 1 . . . . . . . 15 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 . . . . . . 16 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 . . . . . 17 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 . . . . 18 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 . . . 19 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 . . 20 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 .
Wanted to add that there are better ways to do this. If you're being forced to use a DO loop for it, I'd assume it's an assignment.
Never used it personally, but I think (after seeing other posts suggesting it) that PROC EXPAND would be a good fit here.
https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.3/etsug/etsug_expand_syntax02.htm
What is being subtracted here (from column to column)?
Is this is a more general problem where the data can be any numbers, or does it apply only to data which is consecutive integers (in which case no subtraction is needed)?
Good news: We've extended SAS Hackathon registration until Sept. 12, so you still have time to be part of our biggest event yet – our five-year anniversary!
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.
Ready to level-up your skills? Choose your own adventure.