Arrays 如何在SAS中创建维度与另一个数组相同的数组

Arrays 如何在SAS中创建维度与另一个数组相同的数组,arrays,dynamic,sas,Arrays,Dynamic,Sas,我有一个非常简单的问题,可能有一个明显的答案,。。。但它一直在逃避我。也许有人能帮忙 问题是 比如说,我定义了一个周期 %let analysis = y_1005 -- y_1143; 其中y_1005定义了从2010年第5周到2011年第43周的一些变量。然后从这里我定义了一个数组 array period(*) &analysis; 现在我想定义与第一个数组具有相同维度的第二个数组,我认为有一种聪明的方法可以做到这一点,比如 array new_array(dim(period

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

问题是

比如说,我定义了一个周期

%let analysis = y_1005 -- y_1143;
其中y_1005定义了从2010年第5周到2011年第43周的一些变量。然后从这里我定义了一个数组

array period(*) &analysis;
现在我想定义与第一个数组具有相同维度的第二个数组,我认为有一种聪明的方法可以做到这一点,比如

array new_array(dim(period));
但这显然不起作用。我试过各种各样的方法,但都不能成功。如何在创建数组时调用“dim(period)”,或以其他方式执行此操作?

如何:

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

(另请参见我对您原始帖子的评论)

我想出了一个解决方案,解决了@stevepastelan发现的问题,即52/53周后的额外变量。如果将开始和结束期间存储在单独的宏变量中,并使用WEEKU5。informat(例如,2010年第5周的10W05),则可以使用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;

只是一个观察:
array period(*)y_1005-y_1143
包含许多您不需要的额外变量名,例如
y_1053,y_1054,…,y_1099,y_1100,
是的,我在发布问题之后就注意到了这一点。因为我的变量紧随其后,所以我把y_1005--y_1143(我需要延长其他分析的周期,有些年有53周)。太好了。谢谢你这个好的解决方案!我想询问者已经创建了他的变量,并且正在使用
--
(双破折号)来选择它们。没错,我已经有了变量,可以使用--。但展望未来,这种将“周”问题自动化的方法将派上用场。谢谢分享!