我想在 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