CALL LEXCOMBI Routine

Generates all combinations of the indices of n objects taken k at a time in lexicographic order.

Category:Combinatorial
Restriction:This function is not supported in a DATA step that runs in CAS.
Note:Argument types for arguments that are updated must match in CALL routines. All argument types must be CHAR, VARCHAR, or NUMERIC. If the argument types do not match, a warning is issued to the log.

Syntax

CALL LEXCOMBI(n, k, index-1, …, index-k);

Required Arguments

n

is a numeric constant, variable, or expression that specifies the total number of objects.

k

is a numeric constant, variable, or expression that specifies the number of objects in each combination.

index

is a numeric variable that contains indices of the objects in the combination that is returned. Indices are integers between 1 and n, inclusive.

TipIf index-1 is missing or 0, the CALL LEXCOMBI routine initializes the indices to index-1=1 through index-k=k. Otherwise, CALL LEXCOMBI creates a new combination by removing one index from the combination and adding another index.

Details

CALL LEXCOMBI Processing

Before the first call to the LEXCOMBI routine, complete one of the following tasks:

  • Set index-1 equal to 0 or to a missing value.
  • Initialize index-1 through index-k to distinct integers between 1 and n, inclusive.

The number of combinations of n objects taken k at a time can be computed as COMB(n,k). To generate all combinations of n objects taken k at a time, call LEXCOMBI in a loop that executes COMB(n,k) times.

Using the CALL LEXCOMBI Routine with Macros

If you call the LEXCOMBI routine from the macro processor with %SYSCALL, you must initialize all arguments to numeric values. %SYSCALL reformats the values that are returned.

If an error occurs during the execution of the CALL LEXCOMBI routine, both of the following values are set:

  • &SYSERR is assigned a value that is greater than 4.
  • &SYSINFO is assigned a value that is less than –100.

If there are no errors, &SYSERR is set to 0 and &SYSINFO is set to one of the following values:

  • 1 if the value of variable-1 changed
  • j if variable-1 through variable-i did not change, but variable-j did change, where j=i+1
  • –1 if all distinct combinations have already been generated

Comparisons

The CALL LEXCOMBI routine generates all combinations of the indices of n objects taken k at a time in lexicographic order. The CALL ALLCOMBI routine generates all combinations of the indices of n objects taken k at a time in a minimal change order.

Examples

Example 1: Using the CALL LEXCOMBI Routine with the DATA Step

The following example uses the CALL LEXCOMBI routine to generate combinations of indices in lexicographic order.

data _null_;
   array x[5] $3 ('ant' 'bee' 'cat' 'dog' 'ewe');
   array c[3] $3;
   array i[3];
   n=dim(x);
   k=dim(i);
   i[1]=0;
   ncomb=comb(n, k);
   do j=1 to ncomb;
      call lexcombi(n, k, of i[*]);
      do h=1 to k;
         c[h]=x[i[h]];
      end;
      put @4 j= @10 'i= ' i[*] +3 'c= ' c[*];
   end;
run;

SAS writes the following results to the log:

   j=1   i= 1 2 3    c= ant bee cat
   j=2   i= 1 2 4    c= ant bee dog
   j=3   i= 1 2 5    c= ant bee ewe
   j=4   i= 1 3 4    c= ant cat dog
   j=5   i= 1 3 5    c= ant cat ewe
   j=6   i= 1 4 5    c= ant dog ewe
   j=7   i= 2 3 4    c= bee cat dog
   j=8   i= 2 3 5    c= bee cat ewe
   j=9   i= 2 4 5    c= bee dog ewe
   j=10  i= 3 4 5    c= cat dog ewe

Example 2: Using the CALL LEXCOMBI Routine with Macros and Displaying the Return Code

Here is an example of the CALL LEXCOMBI routine that is used with macros. The output includes values for the %SYSINFO macro.

%macro test;
   %let x1=0;
   %let x2=0;
   %let x3=0;
   %let n=5;
   %let k=3;
   %let ncomb=%sysfunc(comb(&n, &k));
   %do j=1 %to &ncomb+1;
      %syscall lexcombi(n, k, x1, x2, x3);
      %let jfmt=%qsysfunc(putn(&j, 5.));
      %let pad=%qsysfunc(repeat(%str(), 6-%length(&x1 &x2 &x3)));
      %put &jfmt: &x1 &x2 &x3 &pad sysinfo=&sysinfo;
   %end;
%mend;
%test

SAS writes the following results to the log:

    1: 1 2 3  sysinfo=1
    2: 1 2 4  sysinfo=3
    3: 1 2 5  sysinfo=3
    4: 1 3 4  sysinfo=2
    5: 1 3 5  sysinfo=3
    6: 1 4 5  sysinfo=2
    7: 2 3 4  sysinfo=1
    8: 2 3 5  sysinfo=3
    9: 2 4 5  sysinfo=2
   10: 3 4 5  sysinfo=1
   11: 3 4 5  sysinfo=-1

See Also

Last updated: September 14, 2026