等效于SAS函数在Proc IML中重复



我想在 PROC IML中定义一个字符串,说" aaaaa"(五个" a")。在DATA步骤中,我将使用repeat()函数,该函数会创建一个重复子字符串的字符串,如文档中所述。

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

但是,在SAS/IML中,repeat()函数不同:它创建了另一个矩阵重复元素(在此处进行文档)。因此,如果我使用此功能,我将获得一个带有五个" A"元素的向量。

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

在那个示例中,我显然无法打扰并直接使用:

x="aaaaa";

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

无需编写循环。使用RowCATC函数将元素串联到列:

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

一个稍难的问题是,将某种定界符的元素插入元素(空白,昏迷等)。在"将向量转换为字符串"的文章中讨论了这个问题。

作为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

最新更新