如何在SAS中创建与另一个阵列具有相同维度的阵列

时间:2012-03-28 12:41:36

标签: arrays dynamic sas

我有一个非常简单的问题,可能有一个明显的答案,......但它一直在逃避我。也许有人可以提供帮助?

问题是这个......

我定义了一段时间,比如说

%let analysis = y_1005 -- y_1143;

其中y_1005定义了从2010年第5周到2011年第43周的一些变量。然后由此我定义了一个数组

array period(*) &analysis;

现在我想定义一个与第一个数组具有相同维度的第二个数组,我认为有一种聪明的方法可以做到这一点,例如

array new_array(dim(period));

但这显然不起作用。我尝试了各种各样的东西,但我无法让它发挥作用。如何在创建数组时调用“dim(period)”,或者以其他方式执行此操作?

3 个答案:

答案 0 :(得分:5)

怎么样:

%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;

(另见我对原帖的评论)

答案 1 :(得分:2)

我提出了一个解决方案,解决了@stevepastelan发现的问题,即超过52/53周的额外变量。如果将开始和结束周期存储在单独的宏变量中并使用WEEKU5。信息(例如2010年第5周的10W05),然后您可以使用DATA NULL 语句计算2个时段之间的周数,并创建要在数组中使用的变量名称的宏列表。我还使用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;

答案 2 :(得分:0)