Эквивалент повторения функции SAS в PROC IML

Я хочу определить строку в PROC IML, скажем, "ааааа" (пять "а"). На этапе DATA я бы использовал функцию repeat(), которая создает строку, повторяющую подстроки, как описано в документацию.

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

Однако в SAS/IML функция repeat() отличается: она создает матрицу, повторяющую элементы другой (документация здесь). Итак, если я использую эту функцию, я получу вектор с пятью элементами «а».

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

В этом примере я, очевидно, мог не беспокоиться и сразу перейти к :

x="aaaaa";

Но что, если мне нужна строка большего размера (например, 100 "a")? Я также мог бы создать его за пределами PROC IML и импортировать его позже, но должен быть более умный способ решить проблему, не так ли?


person Vincent    schedule 22.06.2016    source источник


Ответы (2)


Нет необходимости писать цикл. Используйте функцию ROWCATC для объединения элементов по столбцам:

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

Немного сложнее проблема состоит в том, чтобы объединить элементы и вставить какой-то разделитель между элементами (пробелы, запятые и т. д.). Эта проблема обсуждается в статье "Преобразование вектора в строку."

person Rick    schedule 23.06.2016

Поскольку 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
person Jetzler    schedule 22.06.2016
comment
Спасибо за Ваш ответ ! Мне нужна одна строка, а не вектор. Я буду использовать его как значение по умолчанию при инициализации текстового вектора. Ваше решение работает хорошо, но мне интересно, существовала ли функция, выполняющая это, в IML? - person Vincent; 22.06.2016
comment
Не думаю. Все функции в IML ориентированы на вектор/матрицу. Для этого существует IML. Все остальное можно сделать в шаге данных BASE. - person Jetzler; 22.06.2016