1
votes

I want to define a string in a PROC IML, say "aaaaa" (five "a"). In a DATA step, I would use the repeat() function, which creates a string repeating substrings, as explained in the documentation.

data _null_;
x=repeat('a',4);    /* string with five 'a' */
put x;
run;

However, in SAS/IML, the repeat() function is different : it creates a matrix repeating elements of another one (documentation here). So if I use this function, I will get a vector with five "a" elements.

proc iml;
x=repeat('a',5);    /* 5 'a' strings */
print x;
quit;

In that example, I could obviously not bother and go directly with :

x="aaaaa";

But what if I needed a larger string (say 100 "a" for example) ? I could also create it outside of the PROC IML and import it after but there must be a more clever way to address the problem, isn't there ?

2

2 Answers

3
votes

There is no need to write a loop. Use the ROWCATC function to concatenate the elements across columns:

proc iml;
N = 10;
x = rowcatc(repeat("a", 1, N));  /* repeat 'a' N times */
print x (nleng(x))[L="Length"];

A slightly harder problem is to concatenate elements and insert some sort of delimiter beteen the elements (blanks, comas, etc). That problems is discussed in the article "Convert a vector to a string."

0
votes

As IML works with matrices, that is what you normally would want. To get columns instead of rows:

proc iml;
  x=repeat('a', 1, 5);   
  print x;
quit;

 x
a a a a a

You could convert the vector to string using a loop. But in that case it would make more sense to skip repeat and directly use a loop to produce a string:

proc iml;
  x="";
  do i = 1 to 5;
    x = x + 'a';
  end;
  print x;
quit;

 x
aaaaa