相当于 PROC IML 中的 SAS 函数重复

Equivalent to SAS function repeat in PROC IML

我想在PROC IML中定义一个字符串,比如"aaaaa"(五个"a")。 在 DATA 步骤中,我会使用 repeat() 函数,它创建一个字符串重复子字符串,如 the documentation.

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

然而,在 SAS/IML 中,repeat() 函数是不同的:它创建一个矩阵重复另一个元素(文档 here)。 因此,如果我使用此函数,我将得到一个包含五个 "a" 个元素的向量。

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

在那个例子中,我显然懒得直接去:

x="aaaaa";

但是,如果我需要更大的字符串(例如 100 "a")怎么办?我也可以在 PROC IML 之外创建它并在之后导入它,但是必须有更聪明的方法来解决这个问题,不是吗?

由于 IML 使用矩阵,这正是您通常想要的。 要获取列而不是行:

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

 x
a a a a a

您可以使用循环将矢量转换为字符串。但在那种情况下,跳过重复并直接使用循环生成字符串会更有意义:

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

 x
aaaaa

不需要写循环。使用 ROWCATC 函数跨列连接元素:

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

一个稍难的问题是连接元素并在元素之间插入某种定界符(空格、逗号等)。文章 "Convert a vector to a string."

中讨论了该问题