Greetings,
I am trying to create all possible permutations of last name. Sample data below
Data One_;
Input Id $2. name $30.;
cards;
01 Sun Set
02 Road-Track
03 Peppermint
04 Talenti Cherry Gelato
05 Very Berry Talenti Gelato Test
06 O'Malley
07 Test,Test
;
run;
The number of words in last name is not constant. Below is my code to create the permutation.
Data two_; set one_;
nwords=countw(name, " -");
run;
proc sql noprint;
select max(nwords) into :max_words
from two; quit; %put &max_words;
%macro obsn;
%global nobs;
%let dsid = %sysfunc(open(two));
%if &dsid %then %do;
%let nobs =%sysfunc(attrn(&dsid,nobs));
%let rc = %sysfunc(close(&dsid));
%end; %mend obsn; %obsn; %put &nobs;
data Two (drop=i);
set Two;
array zName {&max_words.} $30;
do i=1 to &max_words.;
zName{i}=scan(name, i,' -');
end; run;
data Out1; set two;
do i=1 to &nobs;
do k=1 to nwords;
nperm=perm(nwords,k);
if i=_n_ then output;
end; end; run;
data Out2; set Out1;
array zName {&max_words.} $30;
do j=1 to nperm;
rc=lexperk(j,k, of zName(*));
if rc<0 then delete;
output; end; run;
I am stuck after this. Based on Out2 data I need to create the new last name varaible using CATX function. I need to concatnate the zname(n) in data Out2 varaibels based on the values in Varaible K. For e.g if K=1 then LN=catx(zname1), K=4 then LN=catx(of zname1-zname4). So basically zname(n) should be based on the K value for each records.
Thanks in advance.
RSVS
... View more