Hi, i have an easy daubt.
But i forgot, how can i summarize columns var1 -- var5 like var1 = 10 var2 = 20 the next columns are the results summarizing of the two columns before.
just like:
var1 var2 var3
10 20 var1+var2 and so on.
This can be made in columns or lines:
var1 var2 var3
10 20 var1+var2 and so on.
Lines
10
20
30
50
80
...
Thanks in advance
Hi @DartRodrigo,
I know that you are mathematically inclined. So, I guess you want to compute the Fibonacci numbers (with somewhat uncommon initial values, though).
Oh, I just see, @Astounding had the same understanding. (And, like me, he was also tempted by the LAG2 function.)
Here are my suggestions:
/* Fibonacci numbers, wide format */
data fibo_wide;
array a[25];
a1=1;
a2=1;
do n=3 to dim(a);
a[n]=a[n-1]+a[n-2];
end;
drop n;
proc print width=min;
run;
/* Ditto with initial values 10, 20 */
data fibo_10_20_wide;
array a[25];
a1=10;
a2=20;
do n=3 to dim(a);
a[n]=a[n-1]+a[n-2];
end;
drop n;
proc print width=min;
run;
/* Fibonacci numbers, long format */
data fibo_long;
i=1; a=1;
output;
do i=2 to 25;
a+lag(a);
output;
end;
proc print;
run;
/* Ditto with initial values 10, 20 */
data fibo_10_20_long;
a=10;
do i=1 to 25;
a+lag(a);
output;
end;
proc print;
var i a ;
run;
/* Ditto, but allowing for arbitrary initial values */
data fibo_10_20_long;
do i=1 to 25;
if i=1 then a=10;
else if i=2 then a=20;
else a+lag_a;
output;
lag_a=lag(a);
end;
drop lag_a;
proc print;
run;
/* Ditto, but without IF-THEN-ELSE logic */
data fibo_10_20_long;
i=1; a=10; link sub;
i=2; a=20; link sub;
do i=3 to 25;
a+lag_a;
link sub;
end;
stop;
sub:
output;
lag_a=lag(a);
return;
drop lag_a;
proc print;
run;
On the one hand, you describe adding columns within a row,
and then the data you provide has only one column and many rows.
It's not clear to me what you really are trying to do.
Can you clarify?
I think this is what you are asking for:
data want;
lines=10;
back1=0;
back2=0;
do i=1 to 20;
back2 = back1;
back1 = lines;
lines + back2;
output;
end;
keep lines;
run;
That would give you the first 20 values in the series.
Also note, usually a Fibonacci series repeats the first item in the series. If that's what you want, this is untested, but should work:
data want;
lines=10;
do i=1 to 20;
lines + lag2(lines);
output;
end;
run;
It's unusual to use LAG in a loop, but I think it would work here.
Good luck.
Hi @DartRodrigo,
I know that you are mathematically inclined. So, I guess you want to compute the Fibonacci numbers (with somewhat uncommon initial values, though).
Oh, I just see, @Astounding had the same understanding. (And, like me, he was also tempted by the LAG2 function.)
Here are my suggestions:
/* Fibonacci numbers, wide format */
data fibo_wide;
array a[25];
a1=1;
a2=1;
do n=3 to dim(a);
a[n]=a[n-1]+a[n-2];
end;
drop n;
proc print width=min;
run;
/* Ditto with initial values 10, 20 */
data fibo_10_20_wide;
array a[25];
a1=10;
a2=20;
do n=3 to dim(a);
a[n]=a[n-1]+a[n-2];
end;
drop n;
proc print width=min;
run;
/* Fibonacci numbers, long format */
data fibo_long;
i=1; a=1;
output;
do i=2 to 25;
a+lag(a);
output;
end;
proc print;
run;
/* Ditto with initial values 10, 20 */
data fibo_10_20_long;
a=10;
do i=1 to 25;
a+lag(a);
output;
end;
proc print;
var i a ;
run;
/* Ditto, but allowing for arbitrary initial values */
data fibo_10_20_long;
do i=1 to 25;
if i=1 then a=10;
else if i=2 then a=20;
else a+lag_a;
output;
lag_a=lag(a);
end;
drop lag_a;
proc print;
run;
/* Ditto, but without IF-THEN-ELSE logic */
data fibo_10_20_long;
i=1; a=10; link sub;
i=2; a=20; link sub;
do i=3 to 25;
a+lag_a;
link sub;
end;
stop;
sub:
output;
lag_a=lag(a);
return;
drop lag_a;
proc print;
run;
Thanks for the answers
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!
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.