Dear all,
I get this error message on running this code. Please can any one help?
data sankey_paths3;
set sankey_paths2;
by starting_node ending_node start end;
/**Hold running totals for group counts**/
array start_n {&n_nodes,&n_grps} (%sysevalf(&n_nodes*&n_grps)*0) ;
array end_n {&n_nodes,&n_grps} (%sysevalf(&n_nodes*&n_grps)*0) ;
/***Build the Bezier Curve Connectors: Use Cubic Bezier Equation:
B(t)=(1-t)^3*P0 + 3(1-t)^2*t*P1 + 3(1-t)*t^2*P2 + t^3*P3, 0 <= t <= 1***/
length path_index $20.;
path_index=catx('-',starting_node,start_index,end_index);
/*Find y-axis values for start/end corners of Bezier curves*/
start_y1=start_group_min+start_group_diff*(start_n(starting_node,start_index)/start_group_n);
start_y2=start_y1+start_group_diff*(n_move/start_group_n);
end_y1=end_group_min+end_group_diff*(end_n(ending_node,end_index)/end_group_n)+end_group_diff*(n_move/end_group_n);
end_y2=end_y1-end_group_diff*(n_move/end_group_n);
/**Bezier Curve 1: From Left group to Right Group path**/
do t = 0 to 1 by 1/25;
x=((1-t)**3)*start_group_x+
3*((1-t)**2)*t*(start_group_x+(end_group_x-start_group_x)/3)+
3*(1-t)*(t**2)*(start_group_x+2*(end_group_x-start_group_x)/3)+
(t**3)*end_group_x;
y=((1-t)**3)*start_y2+3*((1-t)**2)*t*start_y2+3*(1-t)*(t**2)*end_y1+(t**3)*end_y1;
output;
end;
/**Bezier Curve 2: From Right Group back to Left Group**/
do t = 0 to 1 by 1/25;
x=((1-t)**3)*end_group_x+
3*((1-t)**2)*t*(start_group_x+2*(end_group_x-start_group_x)/3)+
3*(1-t)*(t**2)*(start_group_x+(end_group_x-start_group_x)/3)+
(t**3)*start_group_x;
y=((1-t)**3)*end_y2+3*((1-t)**2)*t*end_y2+3*(1-t)*(t**2)*start_y1+(t**3)*start_y1;
output;
end;
/**Increase running total for each groups N**/
start_n(starting_node,start_index)+n_move;
end_n(ending_node,end_index)+n_move;
keep x y path_index start n_move;
run;
This is the message in log (I have attached a test dataset):
ERROR: Array subscript out of range at row 67 column 176. starting_node=1 start=16 start_group_n=1 start_group_min=90.714285714 start_group_max=95.714285714 start_group_diff=5 start_group_x=5 start_index=7 ending_node=2 end=2 end_group_n=14 end_group_min=0 end_group_max=70 end_group_diff=70 end_group_x=33.333333333 end_index=1 n_move=1 FIRST.starting_node=0 LAST.starting_node=1 FIRST.ending_node=0 LAST.ending_node=1 FIRST.start=1 LAST.start=1 FIRST.end=1 LAST.end=1 start_n1=0 start_n2=0 start_n3=0 start_n4=0 start_n5=0 start_n6=0 start_n7=0 start_n8=0 start_n9=0 start_n10=0 start_n11=0 start_n12=0 start_n13=0 start_n14=0 start_n15=0 start_n16=0 start_n17=0 start_n18=0 start_n19=0 start_n20=0 start_n21=0 start_n22=0 start_n23=0 start_n24=0 end_n1=0 end_n2=0 end_n3=0 end_n4=0 end_n5=0 end_n6=0 end_n7=0 end_n8=0 end_n9=0 end_n10=0 end_n11=0 end_n12=0 end_n13=0 end_n14=0 end_n15=0 end_n16=0 end_n17=0 end_n18=0 end_n19=0 end_n20=0 end_n21=0 end_n22=0 end_n23=0 end_n24=0 path_index=1-7-1 start_y1=. _ERROR_=1 _N_=7 NOTE: The SAS System stopped processing this step because of errors. NOTE: There were 8 observations read from the data set WORK.SANKEY_PATHS2. WARNING: The data set WORK.SANKEY_PATHS3 may be incomplete. When this step was stopped there were 6 observations and 67 variables.
The error message gives you a nice clue. At least one of your arrays fail to include the values of starting_node, start_index, ending_node and end_index.
When you create the &n_nodes and &n_groups macro variables, make sure that they are 'large enough' to hold the values of the four variables above.
I don't understand why this is not large enough. Please can you explain?
These are the number of groups I have in each node. Its being working for other datasets, I don't know why it's not working here
I don't know what this data is?
However, to help you the best: Take a look at the 7th observation of your input data. This is where the error happens when the data step reads the data (_N_ = 7).
One of the four variable values here do not fit within the index values of the arrays.
unfortunately I cannot fishout the problem
My first thought is that one of those 4GL variables:
starting_node,start_index,ending_node,end_index
has value outside of array dimensions.
Their values are:
starting_node=1
start_index=7
ending_node=2
end_index=1
one of them must be greater than:
&n_nodes
&n_grps
&n_nodes
&n_grps
Add `%put` before data step to see what values those 4 macrovariables have.
Bart
@PeterClemmensen @yabwon thankyou, I don't know why or what happend but I created the input data again and run
the code again and it's now working
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.