@Hai.Kuo, If I recall, graph theory dictates you can rebuild chain links by simply putting your matrix ^n where n would be either the chain length you consider a chain link to still be a link or is the dimension of your matrix. You will then simply need to convert all values >1 to 1s to return to a binary matrix (it can be optimized, computationally, by using binary "or" but I am not sure that SAS supports it quite well). @TomiKong With regards to what Hai.Kuo wrote, a "simple" way around exceeding the 65k default length of macro variables, would be to load your var names into multiple macro variables and nest the steps using the macro variables into another macro and loop on those. This could be done as follow: break down proc sql; select distinct var into :a_var separated by ' ' from h1; select distinct var into :c_var separated by ', ' from h1; select distinct quote(cats(var)) into :h_var separated by ',' from h1; quit; into proc sql; select distinct var into :a_var1-:a_var99999999 from h1; select distinct var into :c_var1-:c_var99999999 from h1; quit; %let loopend1=&sqlobs; proc sql; select distinct quote(cats(var)) into :h_var1-:h_var99999999 from h1; quit; %let loopend2=&sqlobs; Then nesting the rest of the code into %macro something(); %mend; you can use the fact that the following block is equivalent to &a_var in Hai.Kuo's Code. &a_var1 %do i=2 %to &loopend1; , &&a_var&i %end; On a side note, thanks for this alternative option Hai.Kuo. Everytime I needed to double quote contents using proc sql macro variable allocation, I used to use separated by "," but its less natural to have to add the starting and ending double quotes each time I deref the macro variable. I never even remotely considered the quote function as a way around.
... View more