как создать массив с тем же размером, что и другой массив в SAS - PullRequest
3 голосов
/ 28 марта 2012

У меня очень простой вопрос, на который, вероятно, есть очевидный ответ ... но он все время ускользает от меня.Может быть, кто-то может помочь?

Вопрос заключается в следующем ...

Я определяю период, скажем

%let analysis = y_1005 -- y_1143;

, где y_1005 определяет некоторые переменные, начиная с недели 2010 года 5до года 2011, неделя 43. Затем из этого я определяю массив

array period(*) &analysis;

Теперь я хотел бы определить второй массив с тем же размером, что и первый массив, и я полагаю, что есть разумный способ сделатьчто, например,

array new_array(dim(period));

Но это, очевидно, не работает.Я пробовал разные вещи, но не могу заставить его работать.Как можно назвать «dim (period)» при создании массива или сделать это как-то иначе?

Ответы [ 3 ]

5 голосов
/ 28 марта 2012

Как насчет:

%let analysis = y_1005 - y_1143;

data test;
    array period(*) &analysis;
    call symput ("n_periods", dim(period));
run;

data test2;
    array new_array(&n_periods.);
run;

(см. Также мой комментарий к вашему исходному сообщению)

2 голосов
/ 29 марта 2012

Я придумала решение, которое решает проблему, обнаруженную @stevepastelan, а именно дополнительные переменные после недель 52/53. Если вы храните начальный и конечный периоды в отдельных макропеременных и используете WEEKU5. informat (например, 10W05 для недели 5 2010), затем вы можете использовать инструкцию DATA NULL , чтобы вычислить количество недель между двумя периодами и создать список макросов имен переменных, которые будут использоваться в массиве. Я также использовал PROC FORMAT для создания необходимого формата части года / недели имени переменной (т. Е. 1005).

Надеюсь, это поможет.

%let start=10W05;
%let end=11W43;

proc format;
picture yrwk low-high=%0y%0U (datatype=date);
run;

data _null_;
length varname $10 all_names $1000;
weeks=intck('week',input("&start.",weeku5.),input("&end.",weeku5.));
do i=0 to weeks;
    varname=cats("y_",put(intnx('week',input("&start.",weeku5.),i),yrwk.));
    call catx(' ',all_names,varname);
end;
call symput('weeks',weeks+1); /* start and end weeks are inclusive, so need to add 1 */
call symput('all_names',all_names);
run;

data x;
array period{*} &all_names.;
array new_array{&weeks.};
run;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...