Как создать несколько наборов данных, используя циклы do в SAS/IML?

Я пробовал следующие коды:

proc IML;
do i=1 to 20;  
[some codes to execute]  
data[i];  
end;  
QUIT;

Поэтому я ожидаю получить 20 наборов данных после завершения циклов выполнения. Возможно ли это в SAS? Я могу сделать это с помощью макроса, но я не люблю использовать макрос внутри PROC IML!

Заранее спасибо.


person overwhelmed    schedule 29.03.2015    source источник


Ответы (2)


Если у вас есть SAS/IML 12.1, выпущенный в августе 2012 года как часть SAS 9.3m2, вы можете просто заключить имя каждого набора данных в круглые скобки, например:

proc iml;
names = "Data1":"Data20";
do i = 1 to ncol(names);
   x = i;
   dsname = names[i];   /* construct each name */
   create (dsname) from x;
   append from x;
   close (dsname);
end;

Полную программу и объяснение см. в последнем примере статьи "Чтение наборов данных, заданных массивом имен."

person Rick    schedule 30.03.2015
comment
Большое спасибо @Rick. Я использовал dsname ={}, затем получил 20 наборов данных с именами data1, data2 и так далее. Когда я повторно запускаю коды, он снова создает 20 наборов данных, начиная с 21, то есть data21, data22 и так далее. Можно ли как-нибудь установить предпочитаемое имя? И есть ли способ переопределить наборы данных в случае повторного запуска кодов? - person overwhelmed; 31.03.2015
comment
DSName должен быть скаляром. Я отредактировал программу, чтобы сделать ее более понятной. - person Rick; 31.03.2015
comment
Потрясающе @ Рик. Я ценю это. - person overwhelmed; 03.04.2015

Да, используйте подпрограмму CALL EXECUTE внутри модуля.

proc iml;
file LOG;

output = (1:10)`;

/*This is how you create a data set from a matrix*/
create outdata from output;
append from output;
close outdata;

/*This module will create 1 data set for each variable in OUTPUT*/
start loopit;
do i=1 to 10;
    x = output[i];
    /*build the string you want to execute*/
    outStr = 'create outdata' + catt(i) + " from x; append from x; close outdata" + catt(i) + ";";
    put outStr; /*Print the string to the log*/

    /*Execute the string*/
    call execute(outStr);
end;
finish loopit;

/*Call the module*/
call loopit;

quit;
person DomPazz    schedule 29.03.2015