BookmarkSubscribeRSS Feed
Ronein
Onyx | Level 15

Hello

Lets say I have 10 numbers and I want to choose 6 of them .

There are 210 possible combinations  of choose 6 numbers from 10.(select a subset of 6 elements from a set of 10).

I want to get the all 210 combinations

So in want  data set will have columns: serial X1 X2 X3 X4 X5 X6

what is the way to do it please?

 

%let numbers=2,4,16,21,22,24,27,31,32,34;

Data want;
input serial X1 X2 X3 X4 X5 X6;
cards;
1 4 16 21 22 24
2 16 21 22 24 27
and so on

;
Run;


 

6 REPLIES 6
Kathryn_SAS
SAS Employee

You can use the COMB and ALLCOMB functions to do this. I have modified your code below.

data test;
   array x[10] (2,4,16,21,22,24,27,31,32,34);
   n=dim(x);
   k=6;
   ncomb=comb(n, k);
   do j=1 to ncomb+1;
      rc=allcomb(j, k, of x[*]);
      put j 5. +3 x1-x6 +3 rc=;
   end;
run;
Ksharp
Super User

Yes. The most convenient way is using ALLCOMB() function.

But if you would like to perform it on your own. Here you go.

%let numbers=2,4,16,21,22,24,27,31,32,34;

Data want;
array x{10} _temporary_ (&numbers);
do a1=1 to 10;
do a2=a1+1 to 10;
do a3=a2+1 to 10;
do a4=a3+1 to 10;
do a5=a4+1 to 10;
do a6=a5+1 to 10;
 serial+1;
 x1=x{a1};
 x2=x{a2};
 x3=x{a3};
 x4=x{a4};
 x5=x{a5};
 x6=x{a6};
 output;
end;
end;
end;
end;
end;
end;
drop a:;
Run;
Ksharp
Super User

And Here is a SQL solution.

 

data x;
infile cards dlm=',';
input x @@;
cards;
2,4,16,21,22,24,27,31,32,34
;
run;
ods select none;
ods output sql_results=want;
proc sql number;
select 
x1.x as x1,
x2.x as x2,
x3.x as x3,
x4.x as x4,
x5.x as x5,
x6.x as x6
 from 
x as x1, 
x as x2, 
x as x3, 
x as x4, 
x as x5, 
x as x6
 where
x1.x<x2.x and
x2.x<x3.x and
x3.x<x4.x and
x4.x<x5.x and
x5.x<x6.x 
;
quit;
ods select all;
Rick_SAS
SAS Super FREQ

Since others have given you a DATA step and PROC SQL solution, here is the PROC IML solution:

%let numbers=2,4,16,21,22,24,27,31,32,34;
proc iml;
x = {&numbers};
idx = allcomb(nrow(x), 6);
comb = shape(x[idx,], nrow(idx));
/* then print or save to data set */
Ksharp
Super User

To finish the Rick's IML code with creating a WANT table:

 

%let numbers=2,4,16,21,22,24,27,31,32,34;
proc iml;
x = {&numbers};
idx = allcomb(nrow(x), 6);
comb = shape(x[idx,], nrow(idx));
/* then print or save to data set */
create want from comb[c=('x1':'x6')];
append from comb;
close;
quit;
How to Concatenate Values

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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 6 replies
  • 1304 views
  • 11 likes
  • 5 in conversation