1

我想在 a 中定义一个字符串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并在之后导入它,但必须有更聪明的方法来解决这个问题,不是吗?

4

2 回答 2

3

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

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

一个稍微困难的问题是连接元素并在元素之间插入某种分隔符(空格、逗号等)。在“将向量转换为字符串”一文中讨论了这个问题。

于 2016-06-23T10:10:52.360 回答
0

由于 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
于 2016-06-22T10:07:05.670 回答